2011-02-18 6 views

Respuesta

30

Comprobar si DirectoryInfo.Parent es nulo o no

DirectoryInfo d = new DirectoryInfo(""); 
if(d.Parent == null) { IsRoot = true; } 

también puede obtener la raíz utilizando DirectoryInfo.Root;

3

Trate this:

if (Path.GetPathRoot(location) == location) {...} 
+0

ya tiene el camino, quiere ver si es la raíz, no obtener la raíz. –

+3

@Titan: si obtener la raíz devuelve la misma cadena, entonces es una raíz. Puede que no sea el mejor enfoque, pero es válido. –

+0

@Ben eso es cierto, pero es mucho menos eficiente. No solo requiere trabajar con 2 cadenas, sino también compararlas. –

6

Es mucho más complicado que el control de la propiedad Parent.

Determining Whether a Directory Is a Mounted Folder

Un enfoque sería para ver si tiene éxito GetVolumeNameForVolumeMountPoint.

Por supuesto que no funcionará para la ruta de la red, la determinación de si una unidad de red representa el directorio raíz de una partición puede no ser posible de forma remota.

+0

Mi programa es en C# y GetVolumeNameForVolumeMountPoint es una función C nativa. De todos modos DirectoryInfo.Parent parece funcionar perfectamente. Gracias por el consejo. – asmo

+1

Funciona perfectamente, a menos que le pregunte acerca de un punto de montaje. En cuyo caso 'DirectoryInfo.Parent' le dirá que es un subdirectorio cuando en realidad es el directorio raíz de otra partición. No hay una función gestionada para probar si un directorio en particular es la raíz de su partición, por lo que sugerí una función Win32 nativa. –

+0

Oh, ahora lo entiendo. Gracias por señalar eso! – asmo

1

Ésta es otra manera que encontré:

public static bool IsLogicalDrive(string path) 
{ 
    return Directory.GetLogicalDrives().Contains(path); 
} 

Ésta comprueba efectivamente si la ruta dada representa una de las unidades lógicas del sistema actual.

+0

No todas las particiones tienen su propia letra de unidad. http://technet.microsoft.com/en-us/library/cc938934.aspx –

+0

'Directory.GetLogicalDrives' devuelve una' cadena [] '. 'System.Array' implementa' System.Collections.IList', pero proporciona una implementación de interfaz explícita para Contains: ((.NET 3.5+: https://msdn.microsoft.com/en-us/library/bb336401(v) = vs.110) .aspx)) ((.NET 2, 3: https://msdn.microsoft.com/en-US/library/system.array.system.collections.ilist.contains(v=vs.85)) .aspx)) ((.NET 1.1: https://msdn.microsoft.com/en-us/library/aa310885(v=vs.71).aspx)) El conjunto debe ser lanzado a un 'IList' antes de llamar a Contiene. –

2

También Aquí hay otra manera que encontré:

public static bool IsLogicalDrive(string path) 
{ 
    return (new DirectoryInfo(path).FullName == new DirectoryInfo(path).Root.FullName; 
} 

si esta función devuelve verdadero, entonces significa que camino dado representa una unidad de raíz!

+0

¿Es necesario crear 2 objetos? ¿Qué tal "return path == Path.GetPathRoot (path)" –

+0

@DarrelLee, aunque acepto que 'Path.GetPathRoot()' puede ser la opción más conveniente en algunos casos, no encuentra la raíz de las rutas relativas. https://docs.microsoft.com/en-us/dotnet/api/system.io.path.getpathroot?view=netframework-4.7 Además, dado que estamos usando una comparación de cadenas, queremos asegurarnos de que ambos lados obtener el mismo formato. –

+0

En ese sentido, incluso 'nuevo DirectoryInfo (ruta) .Root.FullName' no es seguro que sea coherente, ya que podría devolver una versión en mayúscula o minúscula de la letra de la unidad. Mejor hacer una conversión de cadena también. –

Cuestiones relacionadas