Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка FileDateToDateTime() 
:(
    Опции темы
Stibrus
Дата 28.3.2006, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.3.2006

Репутация: нет
Всего: нет



Добрый день!
Может быть, кто-нибудь сталкивался с той проблемой, что FileDateToDateTime ( FileAge ( FileName ) ) иногда ошибается на 1-2 секунды?
И может, кто-нибудь придумал, как это лечить?

Мне надо преобразовать дату модификации в строку, а иного пути выйти на DateTimeToStr нет

Заранее спасибо!
PM MAIL   Вверх
Romikgy
Дата 28.3.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Код

ChangeDate.Caption := 
      DateTimeToStr(FileDateToDateTime(FileAge(FileList.FileName)));


вот так в хелпе
Цитата(Stibrus @ 28.3.2006, 12:36 Найти цитируемый пост)
иногда ошибается на 1-2 секунды?

1. это существено?
2. А как проверяешь что есть ошибка?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Stibrus
Дата 28.3.2006, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.3.2006

Репутация: нет
Всего: нет



Задачка, связанная с CVS
CVS считает, что файл изменен, если строка даты/времени файла, хранящаяся в служебном файле CVS/Entries, не совпадает с точностью до секунд с датой/временем изменения файла (с учетом разницы с GMT). На этом ошибка и была поймана - при приведении даты/времени в служебном файле к той дате/времени, которую выдает FileAge, выскакивает ошибка в 1 секунду (один раз заметил 2). Ошибка встречается примерно в 5% случаев.

Это я рассказал к тому, что проблема действительно довольно существенная smile

Это сообщение отредактировал(а) Stibrus - 28.3.2006, 19:50
PM MAIL   Вверх
Poseidon
Дата 28.3.2006, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Обычно, слежение за изменен/не изменен файл делается не по дате последнего изменения, а по контрольной сумме (CRC) файла


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Romikgy
Дата 29.3.2006, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Stibrus, давай определимся
Цитата(Stibrus @ 28.3.2006, 18:45 Найти цитируемый пост)
если строка даты/времени файла, хранящаяся в служебном файле CVS/Entries

почему ты считаешь что это является правильнее чем

Цитата(Stibrus @ 28.3.2006, 18:45 Найти цитируемый пост)
дате/времени, которую выдает FileAge

Это?

Цитата(Stibrus @ 28.3.2006, 18:45 Найти цитируемый пост)
с точностью до секунд

И зачем такая точность?

Цитата(Stibrus @ 28.3.2006, 18:45 Найти цитируемый пост)
CVS

Я не совсем знаю , что это такое, подозреваю прога для слежения за исходниками, я прав?



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Snowy
Дата 29.3.2006, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Romikgy @ 29.3.2006, 08:57 Найти цитируемый пост)
Я не совсем знаю , что это такое, подозреваю прога для слежения за исходниками, я прав?
Control Version System.
Система контроля версий.

Проверить кто прав легко. Просто взять найденный файл и посмотреть его св-ва, как их показывает винда.
Это и будет правильный результат.
PM MAIL   Вверх
Stibrus
Дата 29.3.2006, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.3.2006

Репутация: нет
Всего: нет



Snowy , все совершенно верно, так я и "поймал" ошибку.
2 Romikgy: CVS - система слежения за версиями исходных файлов, крайне полезная когда над проектом работает группа разработчиков.


Немножко углубляясь в задачу, скажу, что мне надо было сделать так, чтобы WinCVS считал файлы неизмененными. Как я уже говорил ранее, путь для этого только один - проставить в служебном файле реальную дату модификации файла. Тут-то и вышел затык - примерно 5% файлов получили погрешность в строке, представляющей эту дату.

Сравнив в Explorer дату/время модификации файла с CVSными, я убедился, что CVS все делает правильно. Отсюда делаю вывод - ошибается приложение на Дельфи.

Далее - два варианта. Либо ошибается FileAge, но (имхо) это просто невозможно, эта функция работает "напрямую" с системой
А явная причина - ошибка пересчета даты/времени из Integer в Float в FileDateToDateTime

В общем, надо делать свою функцию формирования строки на основании даты/времени, возвращаемой FileAge

Это сообщение отредактировал(а) Stibrus - 29.3.2006, 10:52
PM MAIL   Вверх
Romikgy
Дата 29.3.2006, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



GetFileAttributesEx
GetFileInformationByHandle
может это поможет?
Добавлено @ 11:16
GetFileTime
CompareFileTime


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Stibrus
Дата 29.3.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.3.2006

Репутация: нет
Всего: нет



Помимо GetAge опробованы следующие методы:
1. Через TSearchRec
2. FileGetDate()

Оба дали одинаковый результат (т.е. неудовлетворительный)

Вывод: дело все же в FileDateToDateTime() smile
PM MAIL   Вверх
Snowy
Дата 29.3.2006, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Код
function GetFileTimeStr(FileName: string): string;
var
  Handle: THandle;
  FindData: TWin32FindData;
  LocalFileTime: TFileTime;
  st: TSystemTime;
begin
  result := '';
  Handle := FindFirstFile(PChar(FileName), FindData);
  if Handle <> INVALID_HANDLE_VALUE then
  begin
    Windows.FindClose(Handle);
    if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
    begin
      FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
      FileTimeToSystemTime(LocalFileTime, st);
      result := Format('%2u.%2u.%4u~%2u:%2u:%2u',
              [st.wDay, st.wMonth, st.wYear, st.wHour, st.wMinute, st.wSecond]);
      result := StringReplace(result, ' ', '0', [rfReplaceAll]);
      result := StringReplace(result, '~', ' ', [rfReplaceAll]);
    end;
  end;
end;


Так мы избегаем погрешностей TDateTime, который, как известно Double.
А Double = погрешность.
PM MAIL   Вверх
Stibrus
Дата 29.3.2006, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.3.2006

Репутация: нет
Всего: нет



Спасибо, попробую, если все ок - процитирую получившуюся функцию формирования строки в формате CVS (может, кому-нибудь пригодится)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0905 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.