.NET Comment vérifier si le chemin d'accès est un fichier et non un répertoire?
J'ai un chemin d'accès et j'ai besoin de savoir si c'est un répertoire ou 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'existe pas, que puis je ne vais pas aller faire une ou l'autre branche. Donc supposer qu'ils les deux, n'existe.
Vous devez vous connecter pour publier un commentaire.
Utilisation:
et de vérifier si le retour de l'
FileAttributes
résultat contient la valeurFileAttributes.Directory
:Directory.GetFiles
à la chaîne, et voir si le résultat est un nombre supérieur à zéro. Un "chemin d'accès avec des caractères génériques" n'est pas un chemin. C'est un modèle.Je pense que c'est la façon la plus simple d'où vous avez seulement besoin de deux vérifications:
1
de répertoire,2
pour le fichier, et0
d'erreur (par exemple, le nom n'est pas valide). L'outil est minuscule (338 octets source, 3584 octets compilé) et fonctionne très rapidement.Vous pouvez le faire avec une certaine interopérabilité code:
De 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 seul appel de fonction à 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) du Réflecteur:
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.
Modifier Pour répondre au commentaire 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.
En supposant que le répertoire existe...
Check this out:
de http://www.jonasjohn.de/snippets/csharp/is-folder.htm
Lire les attributs de fichier:
Vérifier la Répertoire drapeau.
Donné qu'une chaîne de chemin d'accès ne peut pas représenter à la fois un répertoire et un fichier, puis le suivant fonctionne très bien et ouvre la porte pour d'autres opérations.
Si vous travaillez avec le système de fichiers, à l'aide de
FileInfo
etDirectoryInfo
est beaucoup plus simple que d'utiliser des chaînes de caractères.Hmm, on dirait que le
Files
classe (dansjava.nio
) a fait un statiqueisDirectory
méthode. Donc, je pense que vous pouvez réellement utiliser les éléments suivants: