2008-11-25 2 views
9

Je travaille sur quelque chose qui nécessite de traverser le système de fichiers et pour tout chemin donné, j'ai besoin de savoir à quel point je suis dans la structure des dossiers. Voici ce que je suis en train d'utiliser:C# La meilleure façon d'obtenir la profondeur du dossier pour un chemin donné?

int folderDepth = 0; 
    string tmpPath = startPath; 
    while (Directory.GetParent(tmpPath) != null) { 
     folderDepth++; 
     tmpPath = Directory.GetParent(tmpPath).FullName; 
    } 
    return folderDepth; 

Cela fonctionne mais je soupçonne qu'il existe un moyen meilleur/plus rapide? Beaucoup obligé pour tout commentaire.

Répondre

11

Du haut de ma tête:

Directory.GetFullPath().Split("\\").Length; 
+0

Comme l'idée beaucoup! Juste une note rapide, la longueur est une propriété pas une méthode. – BFree

+0

Oups, bon point; Je vais éditer cela ... –

+5

Serait cassé pour des séquences autrement valides telles que C: \ Folder \ .. \ boot.ini. Ou, pour les chemins réseau UNC tels que \\ serveur \ partage \ fichier. Et, vous devez probablement utiliser Path.DirectorySeperatorCharacter et Path.AltDirectorySeperatorCharacter. –

0

Si vous utilisez les membres de la classe Path, vous pouvez faire face à du caractère Localisations de séparation de chemin et d'autres mises en garde concernant la route. Le code suivant fournit la profondeur (y compris la racine). Ce n'est pas robuste aux mauvaises chaînes et autres, mais c'est un début pour vous.

 int depth = 0; 
     do 
     { 
      path = Path.GetDirectoryName(path); 
      Console.WriteLine(path); 
      ++depth; 
     } while (!string.IsNullOrEmpty(path)); 

     Console.WriteLine("Depth = " + depth.ToString()); 
2

votre chemin a supposant déjà été examinée pour être valide, .NET 3.5, vous pouvez également utiliser LINQ pour le faire en 1 ligne de code ...

Console.WriteLine (@ » C: \ Dossier1 \ Dossier2 \ Dossier3 \ Dossier4 \ MonFichier.txt ".Where (c => c = @" \ "). Nombre);

3

Je suis toujours un fan des solutions récursives. Inefficace, mais amusant! J'aime le code Lisp écrit en C#!

est ici une autre version récursive que j'aime encore mieux, et est probablement plus efficace:

public static int FolderDepth(string path) 
    { 
     if (string.IsNullOrEmpty(path)) 
      return 0; 
     return FolderDepth(new DirectoryInfo(path)); 
    } 

    public static int FolderDepth(DirectoryInfo directory) 
    { 
     if (directory == null) 
      return 0; 
     return FolderDepth(directory.Parent) + 1; 
    } 

bons moments, de bons moments ...

6

Je suis plus tard, mais je voulais pour souligner la réponse de Paul Sonier est probablement le plus court, mais devrait être:

Path.GetFullPath(tmpPath).Split(Path.DirectorySeparatorChar).Length; 
Questions connexes