Comment limiter la profondeur d’une recherche récursive dans un sous-répertoire

J’ai une fonction qui saisit actuellement tous les dossiers et sous-dossiers pour rechercher dans les listes de contrôle d’access un petit outil que je suis en train de construire, mais je me tire les cheveux en essayant de trouver un moyen de limiter la profondeur à laquelle il peut accéder. Par exemple, vous avez un dossier qui a 4 niveaux de profondeur, mais je veux ne pouvoir en saisir que 3 niveaux pour les ACL.

Actuellement, je l’ai codé ainsi:

private void StepThroughDirectories(ssortingng dir) { ssortingng[] directories = Directory.GetDirectories(dir); try { foreach (ssortingng 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); } } 

Évidemment, ce n’est pas aussi bien qu’il l’était parce que je travaille sur le problème depuis un moment, mais si quelqu’un pouvait me diriger dans la bonne direction pour résoudre ce problème, je serais très heureux!

Premièrement, évitez de déclarer le champ recCount extérieur comme une variable «globale». Dans les scénarios récursifs, il est généralement plus facile de passer d’un état à l’autre les appels récursifs.

Deuxièmement, déplacez le test de profondeur hors de foreach pour supprimer les requêtes inutiles sur le système de fichiers pour les sous-répertoires.

Troisièmement, placez la logique de traitement réelle au début de votre méthode, à nouveau en dehors de la boucle de traitement des sous-répertoires.

Votre code ressemblerait alors à:

 void StepThroughDirectories(ssortingng dir) { StepThroughDirectories(dir, 0) } void StepThroughDirectories(ssortingng dir, int currentDepth) { // process 'dir' ... // process subdirectories if (currentDepth < MaximumDepth) { foreach (string subdir in Directory.GetDirectories(dir)) StepThroughDirectories(subdir, currentDepth + 1); } } 

Une méthode possible consiste à append un champ de classe en dehors de votre méthode et une variable pour indiquer le nombre de niveaux à atteindre.

niveaux int;

 private void StepThroughDirectories(ssortingng dir, int depth) { levels ++; if (levels > depth) return; ssortingng[] directories = Directory.GetDirectories(dir); try { ... 

Décrémentez recCount lorsque vous revenez de StepThroughDirectories, mais ce serait mieux …

  private void StepThroughDirectories(ssortingng dir, int depth) { if (depth < 0) return; string[] directories = Directory.GetDirectories(dir); try { foreach (string d in Directory.GetDirectories(dir)) { // your code here Console.WriteLine("{0}", d); StepThroughDirectories(d, depth-1); } } catch (System.Exception e) { Console.WriteLine(e.Message); } }