| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Ошибка FileDateToDateTime() |
| Автор: Stibrus 28.3.2006, 13:36 |
| Добрый день! Может быть, кто-нибудь сталкивался с той проблемой, что FileDateToDateTime ( FileAge ( FileName ) ) иногда ошибается на 1-2 секунды? И может, кто-нибудь придумал, как это лечить? Мне надо преобразовать дату модификации в строку, а иного пути выйти на DateTimeToStr нет Заранее спасибо! |
| Автор: Romikgy 28.3.2006, 13:47 | ||
вот так в хелпе 1. это существено? 2. А как проверяешь что есть ошибка? |
| Автор: Stibrus 28.3.2006, 19:45 |
| Задачка, связанная с CVS CVS считает, что файл изменен, если строка даты/времени файла, хранящаяся в служебном файле CVS/Entries, не совпадает с точностью до секунд с датой/временем изменения файла (с учетом разницы с GMT). На этом ошибка и была поймана - при приведении даты/времени в служебном файле к той дате/времени, которую выдает FileAge, выскакивает ошибка в 1 секунду (один раз заметил 2). Ошибка встречается примерно в 5% случаев. Это я рассказал к тому, что проблема действительно довольно существенная |
| Автор: Poseidon 28.3.2006, 20:44 |
| Обычно, слежение за изменен/не изменен файл делается не по дате последнего изменения, а по контрольной сумме (CRC) файла |
| Автор: Snowy 29.3.2006, 09:27 | ||
Система контроля версий. Проверить кто прав легко. Просто взять найденный файл и посмотреть его св-ва, как их показывает винда. Это и будет правильный результат. |
| Автор: Stibrus 29.3.2006, 10:30 |
| Snowy , все совершенно верно, так я и "поймал" ошибку. 2 Romikgy: CVS - система слежения за версиями исходных файлов, крайне полезная когда над проектом работает группа разработчиков. Немножко углубляясь в задачу, скажу, что мне надо было сделать так, чтобы WinCVS считал файлы неизмененными. Как я уже говорил ранее, путь для этого только один - проставить в служебном файле реальную дату модификации файла. Тут-то и вышел затык - примерно 5% файлов получили погрешность в строке, представляющей эту дату. Сравнив в Explorer дату/время модификации файла с CVSными, я убедился, что CVS все делает правильно. Отсюда делаю вывод - ошибается приложение на Дельфи. Далее - два варианта. Либо ошибается FileAge, но (имхо) это просто невозможно, эта функция работает "напрямую" с системой А явная причина - ошибка пересчета даты/времени из Integer в Float в FileDateToDateTime В общем, надо делать свою функцию формирования строки на основании даты/времени, возвращаемой FileAge |
| Автор: Romikgy 29.3.2006, 11:13 |
| GetFileAttributesEx GetFileInformationByHandle может это поможет? Добавлено @ 11:16 GetFileTime CompareFileTime |
| Автор: Stibrus 29.3.2006, 17:26 |
| Помимо GetAge опробованы следующие методы: 1. Через TSearchRec 2. FileGetDate() Оба дали одинаковый результат (т.е. неудовлетворительный) Вывод: дело все же в FileDateToDateTime() |
| Автор: Snowy 29.3.2006, 17:57 | ||
Так мы избегаем погрешностей TDateTime, который, как известно Double. А Double = погрешность. |
| Автор: Stibrus 29.3.2006, 19:49 |
| Спасибо, попробую, если все ок - процитирую получившуюся функцию формирования строки в формате CVS (может, кому-нибудь пригодится) |