72 votes

.NET Comment vérifier si path est un fichier et non un répertoire?

J'ai un chemin et je dois déterminer s'il s'agit d'un répertoire ou d'un fichier.

Est-ce la meilleure façon de déterminer si le chemin est un fichier?

 string file = @"C:\Test\foo.txt";

bool isFile = !System.IO.Directory.Exists(file) && 
                         System.IO.File.Exists(file);
 

Pour un répertoire, je voudrais inverser la logique.

 string directory = @"C:\Test";

bool isDirectory = System.IO.Directory.Exists(directory) && 
                            !System.IO.File.Exists(directory);
 

Si les deux n'existent pas, je n'irai dans aucune branche. Supposons donc que les deux existent.

112voto

Alnitak Points 143355

Utilisation:

 System.IO.File.GetAttributes(string path)
 

et vérifiez si le résultat FileAttributes renvoyé contient la valeur FileAttributes.Directory :

 bool isDir = (File.GetAttributes(path) & FileAttributes.Directory)
                 == FileAttributes.Directory;
 

53voto

0xA3 Points 73439

Je pense que c'est la manière la plus simple de ne demander que deux vérifications:

 string file = @"C:\tmp";
if (System.IO.Directory.Exists(file))
{
    // do stuff when file is an existing directory
}
else if (System.IO.File.Exists(file))
{
    // do stuff when file is an existing file
}
 

10voto

Scott Dorman Points 25000

Vous pouvez le faire avec une certaine interopérabilité code:

    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
    [return: MarshalAsAttribute(UnmanagedType.Bool)]
    public static extern bool PathIsDirectory([MarshalAsAttribute(UnmanagedType.LPWStr), In] string pszPath);

Pour préciser davantage certains commentaires...

L'introduction de code non managé ce n'est plus inherintly dangereux que n'importe quel autre fichier ou d'e/S, les appels en .NET car ils ultimatley tous appel à du code non managé.

C'est un appel de fonction unique à l'aide d'une chaîne. Vous n'êtes pas introduire de nouveaux types de données et/ou de l'utilisation de la mémoire par l'appel de cette fonction. Oui, vous avez besoin de s'appuyer sur le code non managé pour bien nettoyer, mais vous avez cette dépendance sur la plupart des e/S, les appels.

Pour référence, voici le code dans un Fichier.GetAttributes(string path) à partir de Réflecteur:

public static FileAttributes GetAttributes(string path)
{
    string fullPathInternal = Path.GetFullPathInternal(path);
    new FileIOPermission(FileIOPermissionAccess.Read, new string[] { fullPathInternal }, false, false).Demand();
    Win32Native.WIN32_FILE_ATTRIBUTE_DATA data = new Win32Native.WIN32_FILE_ATTRIBUTE_DATA();
    int errorCode = FillAttributeInfo(fullPathInternal, ref data, false, true);
    if (errorCode != 0)
    {
        __Error.WinIOError(errorCode, fullPathInternal);
    }
    return (FileAttributes) data.fileAttributes;
}

Comme vous pouvez le voir, il est aussi appel à du code non managé afin de récupérer les attributs de fichier, de sorte que les arguments sur l'introduction du code non managé être dangereux ne sont pas valides. De même, l'argument au sujet de rester complètement dans le code managé. Il n'y a pas de code managé mise en œuvre pour ce faire. Même l'appel de Fichier.GetAttributes() que les autres réponses proposons ont les mêmes "problèmes" de l'appel de unmanged code et je crois que c'est la méthode plus fiable pour accomplir déterminer si un chemin est un répertoire.

Edit pour répondre À la remarque de @Christian K sur le TAS. Je crois que la seule raison pour laquelle GetAttributes fait la demande de sécurité est parce qu'il a besoin de lire les propriétés du fichier afin qu'il veut s'assurer que le code appelant est autorisé à le faire. Ce n'est pas le même que l'OS sous-jacent de contrôle (le cas échéant). Vous pouvez toujours créer une fonction wrapper autour de l'appel de P/Invoke pour PathIsDirectory qui exige aussi de certains CAS d'autorisations, si nécessaire.

7voto

tvanfosson Points 268301

En supposant que le répertoire existe ...

 bool isDir = (File.GetAttributes(path) & FileAttributes.Directory)
                  == FileAttributes.Directory;
 

3voto

Dror Points 5006

Regarde ça:

 /// <summary>
/// Returns true if the given file path is a folder.
/// </summary>
/// <param name="Path">File path</param>
/// <returns>True if a folder</returns>
public bool IsFolder(string path)
{
    return ((File.GetAttributes(path) & FileAttributes.Directory) == FileAttributes.Directory);
}
 

de http://www.jonasjohn.de/snippets/csharp/is-folder.htm

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X