Форум: "WinAPI";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];
ВнизКак сравить два 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.039 c