Je traite un TreeView
des répertoires et des fichiers. Un utilisateur peut sélectionner un fichier ou un répertoire, puis en faire quelque chose. Cela nécessite que je dispose d'une méthode qui effectue différentes actions en fonction de la sélection de l'utilisateur.
En ce moment, je fais quelque chose comme ça pour déterminer si le chemin est un fichier ou un répertoire:
bool bIsFile = false;
bool bIsDirectory = false;
try
{
string[] subfolders = Directory.GetDirectories(strFilePath);
bIsDirectory = true;
bIsFile = false;
}
catch(System.IO.IOException)
{
bIsFolder = false;
bIsFile = true;
}
Je ne peux m'empêcher de penser qu'il existe une meilleure façon de procéder! J'espérais trouver une méthode .NET standard pour gérer cela, mais je n'ai pas pu le faire. Existe-t-il une telle méthode et sinon, quel est le moyen le plus simple pour déterminer si un chemin est un fichier ou un répertoire?
Réponses:
De Comment savoir si le chemin est un fichier ou un répertoire :
Mise à jour pour .NET 4.0+
Selon les commentaires ci-dessous, si vous êtes sur .NET 4.0 ou version ultérieure (et que les performances maximales ne sont pas critiques), vous pouvez écrire le code d'une manière plus propre:
la source
&
opérateur au niveau du bit et retournera une valeur binaire où seuls les bits qui sont activés (1) dans les deux opérandes sont activés. Dans ce cas, effectuer une opération au niveau du bit et contreattr
et laFileAttributes.Directory
valeur renverra la valeur deFileAttributes.Directory
si le bit d'attribut de fichier d'annuaire est activé. Voir en.wikipedia.org/wiki/Bitwise_operation pour une meilleure explication.C:\Temp
référence à un répertoire appeléTemp
ou à un fichier appeléTemp
. À quoi sert le code?attr.HasFlag(FileAttributes.Directory)
peut être utilisé à la place.Que diriez-vous de les utiliser?
la source
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
}
Avec seulement cette ligne, vous pouvez obtenir si un chemin est un répertoire ou un fichier:
la source
Voici la mienne:
C'est similaire aux réponses des autres mais pas exactement la même chose.
la source
Path.DirectorySeparatorChar
etPath.AltDirectorySeparatorChar
Comme alternative à Directory.Exists (), vous pouvez utiliser la méthode File.GetAttributes () pour obtenir les attributs d'un fichier ou d'un répertoire, vous pouvez donc créer une méthode d'assistance comme celle-ci:
Vous pouvez également envisager d'ajouter un objet à la propriété de balise du contrôle TreeView lors du remplissage du contrôle qui contient des métadonnées supplémentaires pour l'élément. Par exemple, vous pouvez ajouter un objet FileInfo pour les fichiers et un objet DirectoryInfo pour les répertoires, puis tester le type d'élément dans la propriété de balise pour enregistrer les appels système supplémentaires pour obtenir ces données lorsque vous cliquez sur l'élément.
la source
isDirectory = (fa & FileAttributes.Directory) != 0);
C'était le meilleur que j'ai pu trouver étant donné le comportement des propriétés Exists et Attributes:
Voici comment il teste:
la source
Après avoir combiné les suggestions des autres réponses, j'ai réalisé que j'avais trouvé la même chose que la réponse de Ronnie Overby . Voici quelques tests pour souligner certaines choses à penser:
C:\Temp\folder_with.dot
Path.DirectorySeparatorChar
etPath.AltDirectorySeparatorChar
)Tests (Linqpad)
Résultats
Méthode
la source
Path.DirectorySeparatorChar.ToString()
au lieu de concaténer la chaîne avec""
?new String(Path.DirectorySeparatorChar, 1)
ceToString
que vous voulez, si vous voulez vraiment être optimisé.L'approche la plus précise va utiliser du code d'interopérabilité du shlwapi.dll
Vous l'appeleriez alors comme ceci:
la source
Voici ce que nous utilisons:
la source
Je suis tombé sur ce problème face à un problème similaire, sauf que je devais vérifier si un chemin est pour un fichier ou un dossier lorsque ce fichier ou ce dossier peut ne pas exister . Il y a eu quelques commentaires sur les réponses ci-dessus qui ont mentionné qu'ils ne fonctionneraient pas pour ce scénario. J'ai trouvé une solution (j'utilise VB.NET, mais vous pouvez convertir si vous en avez besoin) qui semble bien fonctionner pour moi:
J'espère que cela peut être utile à quelqu'un!
la source
test.txt
et un fichier peut être nommétest
- dans ces cas, votre code retournerait des résultats incorrectstellement tard dans le jeu, je sais, mais j'ai pensé que je partagerais ça quand même. Si vous travaillez uniquement avec les chemins sous forme de chaînes, il est facile de comprendre cela:
par exemple:
ThePath == "C:\SomeFolder\File1.txt"
finirait par être ceci:Un autre exemple:
ThePath == "C:\SomeFolder\"
finirait par être le suivant:Et cela fonctionnerait également sans la barre oblique inverse:
ThePath == "C:\SomeFolder"
finirait par être ceci:Gardez à l'esprit ici que cela ne fonctionne qu'avec les chemins eux-mêmes, et non la relation entre le chemin et le "disque physique" ... donc il ne peut pas vous dire si le chemin / fichier existe ou quelque chose comme ça, mais c'est sûr peut vous dire si le chemin est un dossier ou un fichier ...
la source
System.IO.FileSystemWatcher
car lorsqu'un répertoire est supprimé, il envoiec:\my_directory
un argument qui est le même lorsqu'un fichierc:\my_directory
sans extension est supprimé.GetDirectoryName('C:\SomeFolder')
revient'C:\'
, donc votre dernier cas ne fonctionne pas. Cela ne fait pas de distinction entre les répertoires et les fichiers sans extension.Path.GetDirectoryName("C:\SomeFolder\SomeSubFolder")
reviendraC:\SomeFolder
. Notez que vos propres exemples de ce que GetDirectoryName retourne montrent qu'il renvoie un chemin d'accès qui ne se termine pas par une barre oblique inverse. Cela signifie que si quelqu'un utilise GetDirectoryName ailleurs pour obtenir un chemin de répertoire, puis le transmet à votre méthode, il obtiendra la mauvaise réponse.Si vous souhaitez trouver des répertoires, y compris ceux qui sont marqués "cachés" et "système", essayez ceci (nécessite .NET V4):
la source
J'en avais besoin, les messages ont aidé, cela le ramène à une seule ligne, et si le chemin n'est pas du tout un chemin, il revient simplement et quitte la méthode. Il répond à toutes les préoccupations ci-dessus, n'a pas besoin non plus de la barre oblique de fin.
la source
J'utilise ce qui suit, il teste également l'extension, ce qui signifie qu'elle peut être utilisée pour tester si le chemin fourni est un fichier mais un fichier qui n'existe pas.
la source
la source
En utilisant la réponse sélectionnée sur ce post, j'ai regardé les commentaires et j'ai rendu hommage à @ ŞafakGür, @Anthony et @Quinn Wilson pour leurs informations qui m'ont conduit à cette réponse améliorée que j'ai écrite et testée:
la source
Peut-être pour UWP C #
la source
Je vois, j'ai 10 ans de retard pour la fête. J'étais confronté à la situation, où à partir d'une propriété, je peux recevoir un nom de fichier ou un chemin de fichier complet. S'il n'y a pas de chemin fourni, je dois vérifier l'existence du fichier en attachant un chemin de répertoire "global" fourni par une autre propriété.
Dans mon cas
a fait l'affaire. D'accord, ce n'est pas magique, mais cela pourrait peut-être faire gagner quelques minutes à quelqu'un. Comme il s'agit simplement d'une analyse de chaîne, les noms Dir avec des points peuvent donner des faux positifs ...
la source
Très tard pour la fête ici, mais j'ai trouvé la
Nullable<Boolean>
valeur de retour assez moche - leIsDirectory(string path)
retournull
n'équivaut pas à un chemin inexistant sans commentaire détaillé, j'ai donc trouvé ce qui suit:Cette méthode d'aide est écrite pour être suffisamment verbeuse et concise pour comprendre l'intention la première fois que vous la lisez.
la source
Cela ne fonctionnerait-il pas?
la source