Comment vérifier si le chemin d'accès est valide sans l'aide de try-catch?
Je veux vérifier si un dossier existe et si non, alors le créer. Mais je ne sais pas si le chemin fourni sera encore valide. Lorsque le chemin n'est pas valide, la suite se passe.
string path = "this is an invalid path";
if (!Directory.Exists(path))
Directory.CreateDirectory(path); //Exception thrown here
Si vous fournissez un chemin d'accès incorrect, qu'il va jeter un DirectoryNotFoundException
exception.
Comment puis-je arrêter cette exception se produise? Je ne veux pas utiliser un try-catch. Je veux détecter que cette exception va se produire avant même que l'exception se produit.
Cochez cette SO: En C# vérifier que le nom de fichier est éventuellement valide (pas que ça existe)
double possible de Comment vérifier si une chaîne donnée est légal (permis) de nom de fichier sous Windows?
double possible de Comment vérifier si une chaîne donnée est légal (permis) de nom de fichier sous Windows?
OriginalL'auteur user1384603 | 2012-12-18
Vous devez vous connecter pour publier un commentaire.
L'explication de l'échec de votre code, c'est que le chemin n'est pas valide. La documentation dit:
D'essayer de prédire à l'avance si oui ou non un répertoire peut être créé, c'est un diable d'un travail. Vous auriez besoin de compte pour la sécurité, le nom du système d'exploitation des règles et des limites du système de fichiers, le nom de règles et de limites, et si oui ou non les lecteurs mappés. Et probablement beaucoup plus de préoccupations. Je voudrais ne pas envisager la re-mise en œuvre de ce que le système fournit gratuitement.
Dans tous les cas, si vous pouvez l'appeler
Directory.Exists
, vous n'avez encore besoin pour permettre une exception levée. Si les modifications du système de fichiers entre l'appel deDirectory.Exists
et l'appel suivant àDirectory.CreateDirectory
, alors une exception est levée. Par exemple, si un autre processus crée le répertoire que vous essayez de créer. Accordée, ce qui est plutôt improbable, mais il est parfaitement possible.En résumé, la meilleure option, d'une distance, est d'attraper l'exception. Comme l'adage bien connu, il vaut mieux demander pardon que de demander la permission.
Il est inutile d'essayer et re-coder toutes les nombreuses couches de la vérification. Intercepter l'exception.
OriginalL'auteur David Heffernan
Utilisation Répertoire.Existe méthode pour vérifier si un dossier existe
N'oubliez pas d'inclure
System.IO;
Ce qui n'empêche pas l'exception de l'occurrence, et c'est une mauvaise idée d'essayer de toute façon.
OriginalL'auteur Habib
Pourquoi ne voulez-vous de les attraper (spécifique) des Exceptions? Il est considéré comme une bonne pratique... de toute façon, ce sont mes solutions sans try/catch:
solution:
solution:
solution:
S'il vous plaît, soyez conscient que ce code peut toujours pas... par exemple, pensez à SecurityExeption (avez-vous le credentionals pour créer un répertoire, il y?!?
Également être au courant il y a encore une (petite) chance que le répertoire a été créé (par un autre processus/thread/...) après votre test avec Exists (), mais avant votre appel de CreateDirectory(). Ces deux appels et ils ne sont pas atomiques (ensemble) lors de l'interrogation/modifier le système de fichiers.
Goldby Oui, pas de contrôle de flux. Mais qu'il est demandé à IO et à un fonctionnement sûr et est considéré comme la meilleure pratique pour attraper les Exceptions spécifiques et peut-être l'envelopper dans de la propre exceptionless IO-Méthodes s'il veulent de cette façon. De toute façon, il n'est pas un énorme travail/flux de contrôle ici, et je ne vois pas l'avantage de ne pas simplement attraper l'exception ici et de le faire comme il est typique de C# et de le faire d'une façon "différente" sans avoir besoin de le faire. La chose qu'il demande, c'est pas possible (à ma connaissance), le chèque n'est pas atomique. Alors pourquoi ne pas l'attraper et il suffit d'aller sur le réel important logique?
Goldby, Il est à propos de tout simplement accepter le fait qu'il n'est pas atomique et a demandé résultat est obsolète et pourrait ne pas être correcte et même résultat pour la suite des opérations (donc, avec vérification du répertoire et de création si elle n'existe pas). Ensuite, prendre les (rares?) cas et de les traiter. Cela ne devrait pas affecter la logique métier très bien à ce niveau la touche func. Si l'exception se produit très souvent... alors vous pourriez penser à pourquoi/qu'est-ce que tu fais, car il semble un cas de défaut et il ya quelque chose de mal avec le "architectural".
Je pense que nous sommes d'accord à partir d'un point de vue pragmatique. J'étais simplement en soulignant que juste parce que vous êtes forcé par .NET pour utiliser les exceptions pour le contrôle de flux, il n'en fait pas des "meilleures pratiques". (C'est plus un mal nécessaire, très légèrement atténué par l'attraper, seulement des exceptions.)
OriginalL'auteur Beachwalker
Vous pouvez également utiliser
Path.GetInvalidFileNameChars()
pour vérifier si le nom du répertoire fourni est valide pour une nouveau nom de répertoire:OriginalL'auteur Joshua Honig
essayer cette
string path = "ceci est un chemin d'accès non valide";
IsPathRooted
lève une exception si le chemin d'accès contient un ou plusieurs des caractères non valides défini dansGetInvalidPathChars
.OriginalL'auteur Akshita
Je pense que la façon la plus simple pour tester si un chemin est valide et que le fichier existe sans lever une exception en C# est l'appel de la fonction non managée
PathFileExists
directement dans shlwapi.dll.Noter que David a écrit dans sa réponse, vous pouvez néanmoins obtenir une exception lorsque vous essayez de créer le répertoire.
OriginalL'auteur Ian Goldby
Vous pouvez utiliser un seul if-else
OriginalL'auteur Marlon Vidal