Недавно добавленные исходники

•  TDictionary Custom Sort  3 223

•  Fast Watermark Sources  2 988

•  3D Designer  4 750

•  Sik Screen Capture  3 259

•  Patch Maker  3 466

•  Айболит (remote control)  3 526

•  ListBox Drag & Drop  2 903

•  Доска для игры Реверси  80 753

•  Графические эффекты  3 842

•  Рисование по маске  3 171

•  Перетаскивание изображений  2 544

•  Canvas Drawing  2 671

•  Рисование Луны  2 500

•  Поворот изображения  2 089

•  Рисование стержней  2 119

•  Paint on Shape  1 522

•  Генератор кроссвордов  2 180

•  Головоломка Paletto  1 730

•  Теорема Монжа об окружностях  2 156

•  Пазл Numbrix  1 649

•  Заборы и коммивояжеры  2 016

•  Игра HIP  1 261

•  Игра Go (Го)  1 200

•  Симулятор лифта  1 421

•  Программа укладки плитки  1 176

•  Генератор лабиринта  1 510

•  Проверка числового ввода  1 295

•  HEX View  1 465

•  Физический маятник  1 322

•  Задача коммивояжера  1 356

 
скрыть


Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

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.





Похожие по теме исходники

Примеры работы с БД

Примеры оформления DBGrid

Пример использования DBGrid

База предприятий и менеджеров 0.99

 

Консольное DOS приложение

Работа с принтером

Локализация приложений

Разбиение файла на части

 

Текст внутри файла




Copyright © 2004-2024 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте