C# - почему делает Систему. IO.File. GetLastAccessTime возвращают математическое ожидание, когда файл не найден?

Объясните свои мысли.

1.  DateTime dt = System.IO.File.GetLastAccessTime("C:\\There_is_no_such_file.txt");
2.  DateTime dt = System.IO.File.GetLastAccessTime("");
  1. Если файл, описанный в параметре пути, не существует, этот метод возвраты 12:00 полуночи, 1 января 1601 нашей эры (C.E). Всемирное координированное время (UTC), скорректированный к местному времени.

  2. Во второй ситуации выдается исключение аргумента.

Почему в первом случае FileNotFoundException (или что-то подобное) не брошен?

13
задан David Neale 4 June 2010 в 07:46
поделиться

6 ответов

Это задокументированное поведение. Из раздела «Примечания» в разделе «Библиотека MSDN»:

Если файл, описанный в параметре пути, не существует, этот метод возвращает 12:00, полночь, 1 января 1601 г. AD (CE) Универсальное скоординированное время (UTC), скорректированное на местное время.

Исключение, которое вы получаете при передаче пустой строки, генерируется кодом, который проверяет, является ли переданная строка допустимым именем пути. Что справедливо, это было бы ошибкой в ​​программе.

Код явный, поэтому это не было сделано по недосмотру или по ошибке. Он использует функцию API FindFirstFile () для поиска файла. Если это не удается, он проверяет ошибку Windows. И явно игнорирует ошибки «Файл не найден», «Путь не найден» и «Диск занят».

Помните, что предлагаемые решения, использующие File.Exists, на самом деле не предотвращают эту проблему. Windows - это многозадачная операционная система.Ваш поток может быть прерван сразу после вызова Exists, и другой процесс может удалить файл. Когда ваш поток восстанавливает процессор, вы все равно получите фиктивную дату.

Единственный гарантированный способ получить точную дату - это сначала открыть файл, чтобы никто не смог удалить файл из-под вас. Что, я думаю, объясняет, почему метод ведет себя именно так. Разработчики каркаса застряли между камнем и наковальней. Если бы они сначала открыли файл, они бы рисковали взорвать другие программы из-за ошибки обмена файлами. Если они сначала не откроют файл, они рискуют случайно и нечасто взорвать вашу программу. Чрезвычайно сложно диагностировать. Приходя выбирать между двумя неприятными вариантами, они выбрали тот, который ничего не бомбит.

Anyhoo, сделайте это надежным, открыв файл.

11
ответ дан 2 December 2019 в 00:17
поделиться

Если вы зададите вопрос "Когда в последний раз обращались к файлу "There_is_no_such_file.txt"?", вы можете ответить либо "There is no such file", либо "never".

Очевидно, что команда, разработавшая библиотеку IO, выбрала второй вариант ответа, причем "никогда" представлено как DateTime.MinValue.

1
ответ дан 2 December 2019 в 00:17
поделиться

Ну, я не писал никакой библиотеки System.IO , поэтому я не могу утверждать, что имею ответ на какие исключения брошены в какой момент. Решение, которое квалифицируется как исключение, всегда остается за разработчиком.

Тем не менее, я могу разобраться в доводах, стоящих за этим.

Наличие несуществующего файла во многих случаях может быть ожидаемым поведением. Необходимость обратиться к файловой системе только для того, чтобы запросить, существует ли файл, а затем ударить его еще раз, чтобы получить время доступа для этого файла, может показаться накладными расходами по сравнению с простым обращением к файловой системе один раз и проверкой результата. Если бы DateTime допускал значение NULL, это, вероятно, дало бы null , точно так же, как можно представить, что IndexOf имел бы вместо -1 .

Во втором случае, однако, передача неверного пути является свидетельством того, что где-то в вашем коде что-то делает ожидание того, что не может работать, и, возможно, имеет смысл перенести это в внимание разработчика посредством выброса исключения.

1
ответ дан 2 December 2019 в 00:17
поделиться

Причина может заключаться в том, что вы отключили проверку «Включить параметр отладки неуправляемого кода» в свойствах проекта в разделе «Отладка».

0
ответ дан 2 December 2019 в 00:17
поделиться

Я считаю, что это было задумано

12:00 полночь, 1 января 1601 г. н.э. (C.E.) - это минимальное значение даты, некоторые люди считают его нулевым значением, но это было после типов, допускающих значение NULL

0
ответ дан 2 December 2019 в 00:17
поделиться

Мы имеем дело с двумя разными вещами.

Когда вы вызываете метод с недопустимым аргументом, он должен вызывать исключение.

Если файл не существует, это не обязательно исключение. Поэтому возвращается значение по умолчанию, которое вы можете протестировать и решить, как действовать. Для метода GetLastAccessTime наличие файла не критично. Если это критично для ВАШЕГО кода, то вы должны нести ответственность за создание ошибки ...

if (!File.Exists("C:\\There_is_no_such_file.txt")) {
    throw new FileNotFoundException();
}
2
ответ дан 2 December 2019 в 00:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: