RTL.FileExists. Неверный результат при дате файла меньше 1980 г.Delphi , Файловая система , ФайлыRTL.FileExists. Неверный результат при дате файла меньше 1980 г.Автор: Batorov_VA Функция FileExists в модуле Sysutils.pas дает неверный результат в случае, если дата файла некорректна. В нашем случае создавался файл с датой 1601 г, который не определялся этой функцией. Эффект проявляется в Delphi 5,6,7. ТИПОВЫЕ РЕШЕНИЯ Не давать возможности создаваться таким файлам. КОММЕНТАРИЙ: Функция FileExists обосновывает свое решение на результате вызова функции FileAge (см. Sysutils.pas). Последняя возвращает -1 в случае, если попытка определить дату была неуспешна (основной причиной считается невозможность найти файл). Поиск в Sysutils по слову "FileAge" обнаруживает следующий комментарий: { FileDateToDateTime converts a DOS date-and-time value to a TDateTime value. The FileAge, FileGetDate, and FileSetDate routines operate on DOS date-and-time values, and the Time field of a TSearchRec used by the FindFirst and FindNext functions contains a DOS date-and-time value. } который недвусмысленно дает понять, что функции, работающие с датой файла, используют DOS-формат для даты/времени. В справке по Win32API в статье о функции FileTimeToDosDateTime читаем ремарку: The MS-DOS date format can represent only dates between 1/1/1980 and 12/31/2107; this conversion fails if the input file time is outside this range. Последняя функция используется в FileAge для конвертирования даты/времени модификации файла в выходной формат (DOS). Естественно, именно в этом месте происходит ошибка, если дата найденного файла не вписывается в диапазон. Понять разработчиков runtime библиотеки можно - это было сделано для обратной совместимости с Delphi 1. То есть, программа, использующая старые функции Sysutils, может быть откомпилирована в любой версии Delphi и будет одинаково работать. Кроме того, при штатном использовании даты файла она никогда не может быть меньше даты рождения компьютера, на котором он был создан/изменен. А формат DOS filetime удобен тем, что помещается целиком в 32-битный integer. Для тех, кто использует дату файла не по назначению, в результате чего она может принимать значение 1601 г, можно посоветовать написать свою функцию FileExists, используя функции API. Для примера можно изучить ту же FileAge. Функция FileExists в модуле Sysutils.pas в Delphi 5,6,7 дает неверный результат при создании файла с датой меньше 19 августа 1980 года. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |