2008-11-25 7 views
9

Estoy trabajando en algo que requiere atravesar el sistema de archivos y para cualquier ruta determinada, necesito saber qué tan "profundo" estoy en la estructura de carpetas. Esto es lo que estoy usando actualmente:C# ¿La mejor manera de obtener la profundidad de la carpeta para una ruta determinada?

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

Esto funciona, pero sospecho que hay una manera mejor/más rápida? Muy agradecido por cualquier comentario.

Respuesta

11

De la parte superior de mi cabeza:

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

¡Me gusta la idea! Solo una nota rápida, Length es una propiedad, no un método. – BFree

+0

Vaya, buen punto; Voy a editar eso ... –

+5

Se romperá para secuencias válidas como C: \ Folder \ .. \ boot.ini. O bien, para rutas de red UNC como \\ server \ share \ file. Y, probablemente debería usar Path.DirectorySeperatorCharacter y Path.AltDirectorySeperatorCharacter. –

0

Si utiliza los miembros de la clase Path, puede hacer frente a localizaciones del carácter de separación ruta y otras advertencias relacionadas a la ruta. El siguiente código proporciona la profundidad (incluida la raíz). No es robusto para las cuerdas malas y tal, pero es un comienzo para ti.

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

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

Asumiendo que su camino ya ha sido examinada por ser válida, en .NET 3.5 también se puede utilizar LINQ hacerlo en 1 línea de código ...

Console.WriteLine (@" C: \ Folder1 \ Folder2 \ Folder3 \ Folder4 \ MyFile.txt ".Where (c => c = @" \ "). Count);

3

Siempre me han gustado las soluciones recursivas. Ineficiente, pero divertido!

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

¡Me encanta el código Lisp escrito en C#!

Aquí es otra versión recursiva que me gusta aún mejor, y es probablemente más eficiente:

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

buenos tiempos, buenos tiempos ...

6

estoy más que a última hora del este, pero yo quería para señalar que la respuesta de Paul Sonier es probablemente la más corta, pero debería ser:

Path.GetFullPath(tmpPath).Split(Path.DirectorySeparatorChar).Length; 
Cuestiones relacionadas