Estoy procesando una TreeView
de directorios y archivos. Un usuario puede seleccionar un archivo o un directorio y luego hacer algo con él. Esto requiere que tenga un método que realice diferentes acciones basadas en la selección del usuario.
En este momento estoy haciendo algo como esto para determinar si la ruta es un archivo o un directorio:
bool bIsFile = false;
bool bIsDirectory = false;
try
{
string[] subfolders = Directory.GetDirectories(strFilePath);
bIsDirectory = true;
bIsFile = false;
}
catch(System.IO.IOException)
{
bIsFolder = false;
bIsFile = true;
}
¡No puedo evitar sentir que hay una mejor manera de hacer esto! Esperaba encontrar un método .NET estándar para manejar esto, pero no he podido hacerlo. ¿Existe tal método, y si no, cuál es el medio más directo para determinar si una ruta es un archivo o directorio?
Respuestas:
De Cómo saber si la ruta es un archivo o directorio :
Actualización para .NET 4.0+
Según los comentarios a continuación, si está en .NET 4.0 o posterior (y el rendimiento máximo no es crítico) puede escribir el código de una manera más limpia:
fuente
&
operador devolverán un valor binario donde solo se activan los bits que están en (1) en ambos operandos. En este caso, hacer un bit a bit y una operación en contraattr
y elFileAttributes.Directory
valor devolverá el valor deFileAttributes.Directory
si el bit de atributo del archivo de Directorio está activado. Ver en.wikipedia.org/wiki/Bitwise_operation para una mejor explicación.C:\Temp
refiere a un directorio llamadoTemp
o a un archivo llamadoTemp
. ¿Qué debe hacer el código?attr.HasFlag(FileAttributes.Directory)
se puede usar en su lugar.¿Qué hay de usar estos?
fuente
File.GetAttributes()
.public static bool? IsDirectory(string path){
if (Directory.Exists(path))
return true; // is a directory
else if (File.Exists(path))
return false; // is a file
else
return null; // is a nothing
}
Con solo esta línea puede obtener si una ruta es un directorio o un archivo:
fuente
Aquí está el mío:
Es similar a las respuestas de otros pero no exactamente igual.
fuente
Path.DirectorySeparatorChar
yPath.AltDirectorySeparatorChar
Como alternativa a Directory.Exists (), puede usar el método File.GetAttributes () para obtener los atributos de un archivo o un directorio, por lo que podría crear un método auxiliar como este:
También podría considerar agregar un objeto a la propiedad de etiqueta del control TreeView al completar el control que contiene metadatos adicionales para el elemento. Por ejemplo, puede agregar un objeto FileInfo para archivos y un objeto DirectoryInfo para directorios y luego probar el tipo de elemento en la propiedad de etiqueta para guardar haciendo llamadas adicionales al sistema para obtener esos datos al hacer clic en el elemento.
fuente
isDirectory = (fa & FileAttributes.Directory) != 0);
Esto fue lo mejor que se me ocurrió dado el comportamiento de las propiedades Existe y Atributos:
Así es como se prueba:
fuente
Después de combinar las sugerencias de las otras respuestas, me di cuenta de que se me ocurrió casi lo mismo que la respuesta de Ronnie Overby . Aquí hay algunas pruebas para señalar algunas cosas en las que pensar:
C:\Temp\folder_with.dot
Path.DirectorySeparatorChar
yPath.AltDirectorySeparatorChar
)Pruebas (Linqpad)
Resultados
Método
fuente
Path.DirectorySeparatorChar.ToString()
en lugar de cadena concat con""
?new String(Path.DirectorySeparatorChar, 1)
lo queToString
hace, si quisiera ser realmente optimizado.El enfoque más preciso será usar algún código de interoperabilidad de shlwapi.dll
Entonces lo llamarías así:
fuente
Esto es lo que usamos:
fuente
Encontré esto cuando enfrentaba un problema similar, excepto que necesitaba verificar si una ruta es para un archivo o carpeta cuando ese archivo o carpeta realmente no existe . Hubo algunos comentarios sobre las respuestas anteriores que mencionaron que no funcionarían para este escenario. Encontré una solución (uso VB.NET, pero puedes convertirla si es necesario) que parece funcionar bien para mí:
¡Espero que esto pueda ser útil para alguien!
fuente
test.txt
y un archivo puede ser nombradotest
- en estos casos, el código sería devolver resultados incorrectosLo sé muy tarde en el juego, pero pensé que compartiría esto de todos modos. Si solo está trabajando con las rutas como cadenas, descubrir esto es fácil como un pastel:
por ejemplo:
ThePath == "C:\SomeFolder\File1.txt"
terminaría siendo esto:Otro ejemplo:
ThePath == "C:\SomeFolder\"
terminaría siendo esto:Y esto también funcionaría sin la barra invertida final:
ThePath == "C:\SomeFolder"
terminaría siendo esto:Tenga en cuenta aquí que esto solo funciona con las rutas en sí mismas, y no con la relación entre la ruta y el "disco físico" ... por lo que no puede decirle si la ruta / archivo existe o algo así, pero seguro puede decirle si la ruta es una carpeta o un archivo ...
fuente
System.IO.FileSystemWatcher
ya que cuando se elimina un directorio, se envíac:\my_directory
como un argumento que es el mismo cuandoc:\my_directory
se elimina una extensión sin archivo .GetDirectoryName('C:\SomeFolder')
regresa'C:\'
, por lo que su último caso no funciona. Esto no distingue entre directorios y archivos sin extensiones.Path.GetDirectoryName("C:\SomeFolder\SomeSubFolder")
volveremosC:\SomeFolder
. Observe que sus propios ejemplos de lo que devuelve GetDirectoryName muestran que devuelve una ruta que no termina en una barra diagonal inversa. Esto significa que si alguien usa GetDirectoryName en otro lugar para obtener una ruta de directorio y luego la alimenta a su método, obtendrá la respuesta incorrecta.Si desea encontrar directorios, incluidos los que están marcados como "oculto" y "sistema", intente esto (requiere .NET V4):
fuente
Necesitaba esto, las publicaciones ayudaron, esto lo reduce a una línea, y si la ruta no es una ruta, simplemente regresa y sale del método. Aborda todas las preocupaciones anteriores, tampoco necesita la barra inclinada final.
fuente
Utilizo lo siguiente, también prueba la extensión, lo que significa que se puede usar para probar si la ruta proporcionada es un archivo pero no existe.
fuente
fuente
Utilizando la respuesta seleccionada en esta publicación, miré los comentarios y creí a @ ŞafakGür, @Anthony y @Quinn Wilson por sus bits de información que me llevaron a esta respuesta mejorada que escribí y probé:
fuente
Quizás para UWP C #
fuente
Ya veo, llevo 10 años tarde para la fiesta. Estaba enfrentando la situación, donde desde alguna propiedad puedo recibir un nombre de archivo o una ruta de acceso completa. Si no se proporciona una ruta, debo verificar la existencia del archivo adjuntando una ruta de directorio "global" proporcionada por otra propiedad.
En mi caso
Hizo el truco. Ok, no es magia, pero quizás esto podría ahorrarle a alguien unos minutos para descubrirlo. Dado que esto es simplemente un análisis de cadenas, los nombres Dir con puntos pueden dar falsos positivos ...
fuente
Muy tarde para la fiesta aquí, pero he encontrado que el
Nullable<Boolean>
valor de retorno es bastante feo:IsDirectory(string path)
regresarnull
no equivale a una ruta inexistente sin comentarios detallados, por lo que se me ocurrió lo siguiente:Este método auxiliar está escrito para ser lo suficientemente detallado y conciso como para comprender la intención la primera vez que lo lees.
fuente
¿No funcionaría esto?
fuente