Question C # -Pourquoi System.IO.File.GetLastAccessTime renvoie-t-il une valeur attendue lorsque le fichier est introuvable?


S'il vous plaît, expliquez vos pensées.

1.  DateTime dt = System.IO.File.GetLastAccessTime("C:\\There_is_no_such_file.txt");
2.  DateTime dt = System.IO.File.GetLastAccessTime("");
  1. Si le fichier décrit dans le paramètre path n'existe pas, cette méthode renvoie 12:00 minuit, le 1er janvier 1601, temps universel coordonné (UTC) A.D. (C.E.), ajusté à l'heure locale.

  2. Dans le second cas, une exception d'argument est levée.

Pourquoi dans un premier temps FileNotFoundException (ou smth. Simmilar) n'est pas lancé?


13
2018-06-04 07:39


origine


Réponses:


Ceci est un comportement documenté. Dans la section Remarques de la rubrique MSDN Library:

Si le fichier décrit dans le paramètre path n'existe pas, cette méthode renvoie 12:00 minuit, le 1er janvier 1601, temps universel coordonné (UTC) A.D. (C.E.), ajusté à l'heure locale.

L'exception que vous obtenez lorsque vous passez une chaîne vide est celle générée par le code qui vérifie si la chaîne transmise est un nom de chemin valide. Ce qui est juste, ce serait un bug dans le programme.

Le code est explicite, ce qui n’a pas été fait par erreur ou par erreur. Il utilise la fonction API FindFirstFile () pour localiser le fichier. Si cela échoue, il vérifie l'erreur Windows. Et ignore explicitement, les erreurs "Fichier introuvable", "Chemin d'accès introuvable" et "Lecteur occupé".

Méfiez-vous des solutions proposées qui utilisent File.Exists ne préviennent pas réellement ce problème. Windows est un système d'exploitation multi-tâches. Votre thread peut être préempté juste après l'appel Exists et un autre processus peut supprimer le fichier. Lorsque votre thread récupère le processeur, vous obtenez toujours la date erronée.

Le seul moyen garanti d'obtenir une date précise est d'ouvrir d'abord le fichier afin que personne ne puisse supprimer le fichier sous vous. Ce qui, je pense, explique pourquoi la méthode se comporte comme elle le fait. Les concepteurs de framework étaient coincés entre un rocher et un endroit difficile. S'ils auraient d'abord ouvert le fichier, ils auraient risqué d'autres programmes bombardant une erreur de partage de fichiers. S'ils n'ouvrent pas le fichier en premier, ils risquent votre bombardement de programme au hasard et rarement. Extrêmement difficile à diagnostiquer. Devant choisir entre deux options désagréables, ils ont choisi celle qui ne bombarde rien.

Anyhoo, rendez-le fiable en ouvrant le fichier.


10
2018-06-04 11:27



Nous traitons deux choses différentes.

Lorsque vous appelez une méthode avec un argument non valide, elle doit générer une exception.

Si le fichier n'existe pas, ce n'est pas nécessairement une exception. Par conséquent, une valeur par défaut est renvoyée, que vous pouvez tester et décider comment procéder. Pour la méthode GetLastAccessTime, il n'est pas essentiel que le fichier existe. Si cela est critique pour VOTRE code, vous devriez être responsable de la génération d'une erreur ...

if (!File.Exists("C:\\There_is_no_such_file.txt")) {
    throw new FileNotFoundException();
}

2
2018-06-04 07:46



Eh bien, je n'ai écrit aucun des System.IO bibliothèque, donc je ne peux pas prétendre avoir le répondre à quelles exceptions sont jetés à quel point. Ce qui constitue une exception sera toujours une décision à prendre par le développeur.

Je peux cependant essayer de comprendre le raisonnement derrière cela.

Avoir un fichier qui n'existe pas peut dans de nombreux cas être un comportement attendu. Avoir à frapper le système de fichiers simplement pour demander si un fichier existe, puis le ré-appuyer pour obtenir le temps d'accès pour ce fichier, peut sembler être une surcharge, comparé au simple fait de frapper le système de fichiers une seule fois et de vérifier le résultat. Si DateTimeétait nullable, cela aurait probablement abouti null, comme on peut l'imaginer IndexOf aurait, au lieu de -1.

Dans le second cas, cependant, le fait de passer un chemin non valide est la preuve que quelque part dans votre code, quelque chose crée une attente à propos de quelque chose qui ne peut pas éventuellement travailler, et il pourrait sans doute être judicieux de porter cela à l'attention du développeur, en lançant une exception.


1
2018-06-04 07:47



Si vous posez la question "Quand était la dernière fois, le fichier" There_is_no_such_file.txt "a été accédé?", Vous pouvez soit répondre "Il n'y a pas un tel fichier" ou "jamais".

De toute évidence, l’équipe qui a conçu la bibliothèque IO a opté pour la deuxième réponse, sans jamais être représentée comme DateTime.MinValue.


1
2018-06-04 07:49



je crois sa par la conception

12:00 minuit, le 1er janvier 1601 A.D. (C.E.) est la valeur de date minium, certaines personnes la considèrent comme une valeur nulle, mais c'était après les types nullables


0
2018-06-04 07:43



La raison pourrait être que vous avez désactivé l'option "Activer l'option de débogage du code non géré" pour archiver les propriétés du projet dans la section Débogage.


0
2018-06-04 07:46