2008-11-25 13 views
9

Pracuję nad czymś, co wymaga przechodzenia przez system plików i dla dowolnej ścieżki, muszę wiedzieć, jak "głęboko" jestem w strukturze folderów. Oto, czego aktualnie używam:C# Najlepszy sposób na uzyskanie głębokości folderu dla danej ścieżki?

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

Działa to, ale podejrzewam, że istnieje lepszy/szybszy sposób? Bardzo zobowiązany za wszelkie opinie.

Odpowiedz

11

Off szczycie mojej głowie:

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

Podobny pomysł! Krótka notatka, Długość to właściwość, a nie metoda. – BFree

+0

Ups, dobry punkt; Zmienię to ... –

+5

Zepsuje się dla innych ważnych sekwencji, takich jak C: \ Folder \ .. \ boot.ini. Lub w przypadku ścieżek sieciowych UNC, takich jak \\ serwer \ udział \ plik. I prawdopodobnie powinieneś użyć Path.DirectorySeperatorCharacter i Path.AltDirectorySeperatorCharacter. –

0

Jeśli używasz członków klasy Path, można poradzić sobie z lokalizacjach znaku rozdzielającego ścieżka i innych ograniczeniach związanych path-. Poniższy kod zapewnia głębokość (w tym root). Nie jest odporny na złe ciągi i takie, ale to dla ciebie początek.

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

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

Zakładając, że droga została już weryfikowane za to ważne w .NET 3.5 można również używać LINQ to zrobić w 1 linii kodu ...

Console.WriteLine (@” C: \ Folder1 \ Folder2 \ Folder3 \ Folder4 \ MójFile.txt ".W przypadku (c => c = @" \ ").

3

Zawsze jestem fanem rekursywnych rozwiązań. Nieefektywne, ale zabawne!

public static int FolderDepth(string path) 
    { 
     if (string.IsNullOrEmpty(path)) 
      return 0; 
     DirectoryInfo parent = Directory.GetParent(path); 
     if (parent == null) 
      return 1; 
     return FolderDepth(parent.FullName) + 1; 
    } 

Uwielbiam kod Lisp napisany w języku C#!

Oto kolejny rekurencyjną wersję, która mi się podoba, nawet lepiej, i jest prawdopodobnie bardziej efektywne:

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; 
    } 

Good times, good times ...

6

Jestem bardziej niż późno na to, ale chciałem podkreślić, że odpowiedź Paula Soniera jest prawdopodobnie najkrótsza, ale powinna być:

Path.GetFullPath(tmpPath).Split(Path.DirectorySeparatorChar).Length; 
Powiązane problemy