302 votos

Mejor manera de comprobar si Sendero es un archivo o un directorio?

Yo soy de procesamiento de la vista de árbol de directorios y archivos, los usuarios pueden seleccionar un archivo o un directorio y, a continuación, hacer algo con él. Esto me obliga a tener un método que realiza diferentes acciones si se ha seleccionado un archivo o un directorio.

En este momento estoy haciendo algo como esto para determinar si la ruta de acceso de un archivo o de 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 dejar de sentir que hay una manera mejor de hacer esto! Pero no puedo encontrar ninguna .Net los métodos que se me puede preguntar "¿Es esta la ruta de un directorio o un archivo ?".

Alguna sugerencia ?

Gracias!

458voto

Quinn Wilson Puntos 2450

desde http://bytes.com/topic/c-sharp/answers/248663-how-dirá-si-directory-path-archivo :

 // get the file attributes for file or directory
FileAttributes attr = File.GetAttributes(@"c:\Temp");

//detect whether its a directory or file
if((attr & FileAttributes.Directory) == FileAttributes.Directory)
    MessageBox.Show("Its a directory");
else
    MessageBox.Show("Its a file");
 

190voto

llamaoo7 Puntos 1330

¿Cómo sobre el uso de estos?

 File.Exists();
Directory.Exists();
 

6voto

Michael McCloskey Puntos 1765

Como una alternativa a la Directorio.existe(), puede utilizar el File.GetAttributes() método para obtener los atributos de un archivo o un directorio, por lo que podría crear un método auxiliar como este:

private static bool IsDirectory(string path)
{
    System.IO.FileAttributes fa = System.IO.File.GetAttributes(path);
    bool isDirectory = false;
    if ((fa & FileAttributes.Directory) != 0)
    {
        isDirectory = true;
    }
    return isDirectory;
}

Usted también podría considerar la adición de un objeto a la propiedad tag del control TreeView al llenar el control que contiene metadatos adicionales para el elemento. Por ejemplo, usted podría agregar un objeto FileInfo de archivos y un objeto DirectoryInfo de directorios y, a continuación, pruebe el tipo de elemento en la etiqueta de propiedad para salvar a hacer nuevas llamadas al sistema para obtener los datos cuando se hace clic en el elemento.

5voto

Scott Dorman Puntos 25000

El enfoque más preciso se va a utilizar un código de interoperabilidad de la shlwapi.dll

 [DllImport(SHLWAPI, CharSet = CharSet.Unicode)]
[return: MarshalAsAttribute(UnmanagedType.Bool)]
[ResourceExposure(ResourceScope.None)]
internal static extern bool PathIsDirectory([MarshalAsAttribute(UnmanagedType.LPWStr), In] string pszPath);
 

A continuación, llamarlo así:

 #region IsDirectory
/// <summary>
/// Verifies that a path is a valid directory.
/// </summary>
/// <param name="path">The path to verify.</param>
/// <returns><see langword="true"/> if the path is a valid directory; 
/// otherwise, <see langword="false"/>.</returns>
/// <exception cref="T:System.ArgumentNullException">
/// <para><paramref name="path"/> is <see langword="null"/>.</para>
/// </exception>
/// <exception cref="T:System.ArgumentException">
/// <para><paramref name="path"/> is <see cref="F:System.String.Empty">String.Empty</see>.</para>
/// </exception>
public static bool IsDirectory(string path)
{
    return PathIsDirectory(path);
}
 

2voto

lhan16 Puntos 2241

Me encontré con esto cuando enfrenta un problema similar, excepto que tenía que comprobar si un camino es para un archivo o carpeta cuando ese archivo o carpeta no existe en realidad. Había algunas observaciones sobre las respuestas de arriba que mencionaron que no iba a funcionar para este escenario. He encontrado una solución (yo uso VB.NET, pero usted puede convertir si necesita) que parece funcionar bien para mí:

 Dim path As String = "myFakeFolder\ThisDoesNotExist\"
Dim bIsFolder As Boolean = (IO.Path.GetExtension(path) = "")
'returns True

Dim path As String = "myFakeFolder\ThisDoesNotExist\File.jpg"
Dim bIsFolder As Boolean = (IO.Path.GetExtension(path) = "")
'returns False
 

Esperemos que esto puede ser útil a alguien!

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X