Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.18;
Скачать: CL | DM;

Вниз

Как сравить два FILETIME   Найти похожие ветки 

 
zek   (2006-11-07 10:11) [0]

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


 
Anatoly Podgoretsky ©   (2006-11-07 10:13) [1]

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

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


 
DVM ©   (2006-11-07 10:18) [2]


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


 
BiN ©   (2006-11-07 10:23) [3]

можно и так

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;


 
BiN ©   (2006-11-07 10:25) [4]

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


 
ЮЮ ©   (2006-11-07 10:59) [5]


> since January 1, 1601.


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


 
ZeK   (2006-11-07 11:29) [6]

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

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) даёт неверный результат. Что не так?


 
BiN ©   (2006-11-07 12:05) [7]


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2007.03.18;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.052 c
15-1171888914
Desdechado
2007-02-19 15:41
2007.03.18
Заголовок журнальной статьи


8-1152996420
@!!ex
2006-07-16 00:47
2007.03.18
Упаковка звука.


2-1172512857
ishicucu
2007-02-26 21:00
2007.03.18
Передача данных в Excel


2-1172148385
Виталий Гаврилов
2007-02-22 15:46
2007.03.18
как мне отразить результат вычислений


6-1159949661
Nickla
2006-10-04 12:14
2007.03.18
VPN соединение в DELPHI