tiempo - C#¿La mejor forma de obtener la profundidad de la carpeta para una ruta determinada?
se deja caer una piedra en un pozo de agua (5)
La parte superior de mi cabeza:
Directory.GetFullPath().Split("//").Length;
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:
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 forma mejor / más rápida? Muy agradecido por cualquier comentario.
Si usa los miembros de la clase Path
, puede hacer frente a las localizaciones del carácter de separación de ruta y otras advertencias relacionadas con 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());
Siempre me gustan 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í hay otra versión recursiva que me gusta aún mejor, y probablemente sea 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 momentos ...
Suponiendo que su ruta de acceso ya ha sido verificada por ser válida, en .NET 3.5 también podría usar LINQ para hacerlo en 1 línea de código ...
Console.WriteLine (@ "C: / Folder1 / Folder2 / Folder3 / Folder4 / MyFile.txt" .Where (c => c = @ "/"). Count);
Estoy más que tarde en esto, pero quería 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;