Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сравить два FILETIME [D6, Win2k]


zek ©   (2006-11-07 10:11:00) 

Вернее не просто сравнить, а узнать точную разницу между ними в днях, часах, минута... Мне нужно найти файлы иземенные, к примеру 2 дня назад. Вся загвоздка в том, что FILETIME хранит значение в двух int. Хотел конвертировать в double, но что-то не получилось.
Заранее спасибо.


ZeK   (2006-11-07 12:29:00) [1]

2BiN. Пасиба, заработало.


BiN   (2006-11-07 12:05:00) [2]


> ZeK   (07.11.06 11:29) [6]
>
>
> Но выражение ((FILETIMEEX(st).Value - FILETIMEEX(FD.ftCreationTime).
> Value) / d) даёт неверный результат. Что не так?
>

Замени double на Int64, а / на div


ZeK   (2006-11-07 11:29:00) [3]

Проанализировав выше написанное попытался сотворить следующее:

var
 ft: FILETIME;
 st: FILETIME;
 hFind: Cardinal;
 FD: WIN32_FIND_DATA;
 d: double;
begin
 d := 10 * 1000;                       // глупо, но иначе выдаёт
 d := d * 1000 * 60 * 60 * 24;   // ошибку арифметического переполнения
 hFind := FindFirstFile(PChar(GetCurrentDir + '\*.*'), FD);
 GetSystemTimeAsFileTime(st);
 while FindNextFile(hFind, FD) <> false do
 begin
   if ((FILETIMEEX(st).Value - FILETIMEEX(FD.ftCreationTime).Value) / d) > 7 then \\ т.е. файл недельной давности
   begin
       DeleteFile(PChar(@FD.cFileName[0]));
   end;
 end;


Но выражение ((FILETIMEEX(st).Value - FILETIMEEX(FD.ftCreationTime).Value) / d) даёт неверный результат. Что не так?


ЮЮ   (2006-11-07 10:59:00) [4]


> since January 1, 1601.


Очевидно, время создания первого файла? :)


BiN   (2006-11-07 10:25:00) [5]

Для справки
FILETIME - 100-nanosecond intervals since January 1, 1601.
(с) msdn


BiN   (2006-11-07 10:23:00) [6]

можно и так

type
 FILETIMEEX = packed record
   case Byte of
     0: (Value: Int64);
     1: (Lo, Hi: DWORD);
 end;
var
 F1, F2: FILETIME;
begin
 if FILETIMEEX(F1).Value>FILETIMEEX(F2).Value then
   ...;
end;


DVM   (2006-11-07 10:18:00) [7]


function CompareSystemTime(const D1, D2 : TSystemTime) : Integer;
  procedure CompareFields(const F1, F2 : Integer);
  begin
     if Result <> 0 then Exit;
     if F1 = F2 then Exit;
     if F1 < F2 then
        Result := -1
     else
        Result := 1;
  end;
begin
  Result := 0;
  CompareFields( D1.wYear, D2.wYear );
  CompareFields( D1.wMonth, D2.wMonth );
  CompareFields( D1.wDay, D2.wDay );
  CompareFields( D1.wHour, D2.wHour );
  CompareFields( D1.wMinute, D2.wMinute );
  CompareFields( D1.wSecond, D2.wSecond );
  CompareFields( D1.wMilliseconds, D2.wMilliseconds );
end;

function GetFileCreationTime(const FileName: string): TSystemTime;
var
 hFile: THandle;
 FindData: TWin32FindData;
begin
 hFile := FindFirstFile(PChar(FileName), FindData);
 if hFile <> INVALID_HANDLE_VALUE then
 begin
   FindClose(hFile);
   FileTimeToSystemTime(FindData.ftCreationTime, Result)
 end;
end


Anatoly Podgoretsky   (2006-11-07 10:13:00) [8]

> zek  (07.11.2006 10:11:00)  [0]

А как ты ищешь, это же не относится к Дельфи, это к АПИ, а вопрос здесь


Наверх

Титульная страница Поиск, карта сайта Написать письмо