I've got a function that currently grabs all folders and sub-folders to check the ACL's for a small tool I'm building but I'm pulling my hair out trying to figure out how to limit the depth that it can go to. For example you have a folder that goes 4 levels deep but I want to be able to only grab 3 levels of it for ACL's.
Currently I have it coded thusly:
private void StepThroughDirectories(string dir)
{
string[] directories = Directory.GetDirectories(dir);
try
{
foreach (string d in Directory.GetDirectories(dir))
{
if (recCount < (int)Depth)
{
GetACLs(d, new DirectoryInfo(d));
pBar.Value += 1;
//MessageBox.Show("Recursive Level: " + counter.ToString());
recCount++;
StepThroughDirectories(d);
}
else
{
recCount--;
}
}
}
catch (System.Exception e)
{
Console.WriteLine(e.Message);
}
}
Obviously that's not as nice as it was because I've been working on the problem for a little while but if anyone can point me in the right direction to solve this issue I would be very happy!
First, avoid declaring the recCount
field outside as a “global” variable. In recursive scenarios it's usually more manageable to pass state along the recursive calls.
Second, move the depth test out of the foreach
to remove unnecessary querying of the file system for subdirectories.
Third, place the actual processing logic at the beginning of your method, again out of the subdirectories processing loop.
Your code would then look like:
void StepThroughDirectories(string dir)
{
StepThroughDirectories(dir, 0)
}
void StepThroughDirectories(string dir, int currentDepth)
{
// process 'dir'
...
// process subdirectories
if (currentDepth < MaximumDepth)
{
foreach (string subdir in Directory.GetDirectories(dir))
StepThroughDirectories(subdir, currentDepth + 1);
}
}
One possible method, add a class field outside your method and a variable to indicate how many levels deep to go max.
int levels;
private void StepThroughDirectories(string dir, int depth)
{
levels ++;
if (levels > depth)
return;
string[] directories = Directory.GetDirectories(dir);
try
{ ...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With