Selon le documentation , la méthode File.Exists ne génère pas d'exceptions:
Renvoie true si l'appelant dispose des autorisations requises et que le chemin contient le nom d'un fichier existant; sinon, faux. Cette méthode renvoie également false si le chemin est nul, un chemin non valide ou une chaîne de longueur nulle. Si l'appelant n'a pas les autorisations suffisantes pour lire le fichier spécifié, aucune exception n'est levée et la méthode renvoie false quelle que soit l'existence du chemin.
On dirait donc qu'il ne lance pas d'exceptions de lui-même. Mais un appel à File.Exists peut-il entraîner une exception? En d'autres termes, dois-je l'envelopper dans un try / catch?
5 Réponses :
Il n'y a pas d'exceptions répertoriées dans la documentation pour cette méthode, ce qui implique qu'aucune exception ne doit être levée. En fait, plus bas, il mentionne que "false" sera renvoyé si une exception aurait été lancée en essayant d'accéder au fichier.
Oui, cela peut générer des exceptions.
Par exemple: OutOfMemoryException .
Ce type d'exception peut ne pas être levé par le code lui-même, mais peut être levé comme un effet secondaire de son exécution.
Il en va de même pour la tristement célèbre StackOverflowException, ou aussi, d'autres exceptions de bas niveau peut-être dues à un matériel défaillant.
Je ne connais pas la liste totale; mais je suis sûr; appeler le code peut entraîner la levée d'exceptions.
Comme le note @Otis: il sera difficile de se remettre de ce genre d'exceptions. Donc, même s'ils sont surélevés: souvent un try / catch ne sera pas suffisant.
Donc, pour résumer:
Un appel à File.Exists peut-il entraîner une exception?
Oui
En d'autres termes, dois-je l'envelopper dans un try / catch?
Une autre question, mais probablement pas.
Cela ne semble pas être le genre d'exception dont vous pouvez essayer / sortir.
@Otis c'est une toute autre question. C'est pourquoi j'ai directement lié mes articles préférés. Ils ont aidé beaucoup de gens.
@Otis Selon l'article lié, il semble que vous le puissiez. Sauf si je manque quelque chose.
@AngryHacker: non, il y a toujours des tonnes d'exceptions qui peuvent survenir au-delà de la portée du framework .net. Ils seront de bas niveau et vous ne pourrez pas les attraper. Si la mémoire est corrompue, votre application peut simplement se fermer même avec un maximum de blocs de capture tty. Dans le pire des cas, vous obtiendrez le fameux écran bleu sur Windows. Maintenant, la méthode elle-même ne causerait probablement pas cela, mais l'appel peut le déclencher; et vous ne récupérerez pas en attrapant des exceptions. Ne me croyez pas: essayez xamarin avec android sdk ;-)
Tout peut entraîner une exception. Même si le code lui-même n'en lance pas un, que faire si vous rencontrez une exception fatale comme OutOfMemory ou ThreadAborted?
Cela semble être principalement une question sur la gestion des exceptions, et pour ces questions, j'ai deux articles que je lie souvent:
Si vous voulez apprendre à gérer les exceptions, c'est un très bon début.
Non, selon le code source a >: Il ne semble pas y avoir de cas où il devrait lancer une exception à moins que EDIT: Comme je ne peux pas trouver le code source de Il appelle à son tour // Determine whether path describes an existing directory
// on disk, avoiding security checks.
[System.Security.SecurityCritical] // auto-generated
[ResourceExposure(ResourceScope.Machine)]
[ResourceConsumption(ResourceScope.Machine)]
internal static bool InternalExists(String path, out int lastError) {
Win32Native.WIN32_FILE_ATTRIBUTE_DATA data = new Win32Native.WIN32_FILE_ATTRIBUTE_DATA();
lastError = File.FillAttributeInfo(path, ref data, false, true);
return (lastError == 0) && (data.fileAttributes != -1)
&& ((data.fileAttributes & Win32Native.FILE_ATTRIBUTE_DIRECTORY) != 0);
}
FileSystem.FileExists ne lève une exception que je ne connais pas. FileSystem.FileExists , j'ai vérifié le . NET Framework code source à la place, c'est un peu différent lors de l'appel interne: // Tests whether a file exists. The result is true if the file
// given by the specified path exists; otherwise, the result is
// false. Note that if path describes a directory,
// Exists will return true.
public static bool Exists(string path)
{
try
{
if (path == null)
return false;
if (path.Length == 0)
return false;
path = Path.GetFullPath(path);
// After normalizing, check whether path ends in directory separator.
// Otherwise, FillAttributeInfo removes it and we may return a false positive.
// GetFullPath should never return null
Debug.Assert(path != null, "File.Exists: GetFullPath returned null");
if (path.Length > 0 && PathInternal.IsDirectorySeparator(path[path.Length - 1]))
{
return false;
}
return FileSystem.FileExists(path);
}
catch (ArgumentException) { }
catch (IOException) { }
catch (UnauthorizedAccessException) { }
return false;
}
FillAttributeInfo (le code est un peu long donc je ne le colle pas ici), je pense qu'il ne lance que IOException (à la ligne 1402 __Error .WinIOError (); )
Que faire si FileSystem.FileExists (chemin) entraîne une exception régulière? Cela n'exploserait-il pas?
@AngryHacker: oui, bien que formellement une "exception" régulière ne devrait pas être soulevée. Plus probablement, il explosera en cas de problèmes de mémoire. Pour être sûr qu'il n'y en a pas d'autres, toutes les fonctions d'appel doivent être analysées. Bien que l'on puisse supposer, puisque c'est documenté, ils sont couverts par des cas de test réels.
@AngryHacker Désolé, je ne trouve pas vraiment le code source de FileSystem.FileExists donc je ne suis pas sûr, mais en supposant que dans la liste des catch es, je pense que ce sont tous les Exceptions. Comme Stefan l'a noté, il s'agit plus probablement d'une exception de bas niveau (comme OutOfMemoryException ) que les exceptions normales.
@LukeVo FileSystem.FileExists est défini dans FileSystem.Exists.Unix.cs et Systemsem.Windows.c. a>. Hormis un appel à Debug.Assert () , aucune exception n'est levée.
@BACON wow merci de le suivre, je suis tombé sur FileSystem.Windows.cs d'une manière ou d'une autre, mais je l'ai sauté, car ce n'était pas dans le navigateur source.
@LukeVo Mais cela peut toujours entraîner un MOO car il y a une allocation path = Path.GetFullPath (path); , correct?
@AngryHacker oui, tout peut entraîner OutOfMemoryException (ou dans un cas plus rare, StackOverflowException ), mais vous ne pouvez pas vraiment essayer de les attraper comme d'habitude (plus de détails dans l'autre réponses)
Oui, j'ai rencontré cette exception:
System.IO.PathTooLongException: 'Le chemin spécifié, le nom de fichier ou les deux sont trop longs. Le nom de fichier complet doit comporter moins de 260 caractères et le nom du répertoire doit contenir moins de 248 caractères. "
L'exception provenait de Path.GetFileName que File.Exists appelait.
Essaye le. Mettez dans quelques chemins invalides.
Oui. L'utilisateur peut ne pas disposer des informations d'identification pour vérifier si le fichier existe.
@jdweng Cela ne relève-t-il pas de "Si l'appelant n'a pas les autorisations suffisantes pour lire le fichier spécifié, aucune exception n'est levée" dans la documentation citée?
selon la documentation, aucune exception n'est levée, voici le lien vers la documentation. docs.microsoft.com/ fr-fr / dotnet / api /…
L'utilisateur peut avoir l'autorisation de lire le dossier, mais pas l'autorisation de lire les fichiers.
String [] chemins = null; System.IO.File.Exists (paths.First ());@ 15ee8f99-57ff-4f92-890c-b56153 Ensuite, l'appel
.First ()sur une référence nulle serait la cause de l'exception, pas l'appel àFile.Exists