Форум: "Начинающим";
Текущий архив: 2014.06.29;
Скачать: [xml.tar.bz2];
Внизобновление по дате изменения файла Найти похожие ветки
← →
Дмитрий (2013-08-22 21:05) [0]Здравствуйте, Мастера
Сделал обновлялку-загружалку для основной проги.
Обновлялка должна сравнить заданные параметры (время изменения) файлов в директории на сервере в локалке (PathUpd) с аналогичными для файлов в папке запуска (PathCurr).
При обнаружении отличия скопировать с заменой
Однако, обновление происходит не всегда.
Вчера обнаружил, что обновление сработало сразу после ручного открытия папки на сервере в проводнике.
Как будто, обращение происходило через кэш.
Прошу растолковать что происходит, на что смотреть.
Кусок кода:
SearchUpd : TSearchRec;
...
if not DirectoryExists(PathUpd) then exit;
// Пробуем найти файлы в текущем каталоге
//Заполняем SearchUpd списком файлов из каталога обновлений
if FindFirst( PathUpd + "*.*", faAnyFile - faDirectory, SearchUpd) = 0 then
begin
repeat
// найденный файл ищем в папке с текущей версией
FileUpd:=PathUpd + SearchUpd.Name;
FileCurr:=PathCurr + SearchUpd.Name;
//Проверяем наличие такого файла в рабочей папке
if FindFirst( FileCurr, faAnyFile - faDirectory, SearchCurr) = 0 then
begin
// если такой файл найден проверяем размер и дату
NeedUpd := (SearchUpd.Size<>SearchCurr.Size) //если размер изменился...
or (FileAge(FileUpd) <> FileAge(FileCurr)) //дата создания не годится, т.к. при копировании файла датой создания будет дата копирования
;
end
else
NeedUpd := true; // если файл не найден - требуется копирование
if NeedUpd then
if CopyFile(Pchar(FileUpd), Pchar(FileCurr), false) then//копируем, даже если файл существует
begin
Success:=Success + 1;
end
else
begin
Err :=Err + 1;
FailStr :=FailStr + SearchUpd.Name + ";";
end;
← →
Дмитрий (2013-08-23 18:56) [1]при каких условиях FileAge измененного файла может оказаться таким же как у предыдущего?
← →
Дмитрий (2013-08-26 15:30) [2]?
← →
Dimka Maslov © (2013-08-26 15:41) [3]Лично у меня проверяется так:
SrcAge := GetFileAge(Source, False);
DstAge := GetFileAge(Dest, False) + 1/24/60;
if SrcAge > DstAge then begin
и всё всегда обновляется.
Можно ещё контрольные суммы сравнивать.
← →
Дмитрий (2013-08-26 17:25) [4]Функции FileAge(FileUpd) GetFileAge () возвращают одно и тоже или результаты могут быть разными?
Контрольные суммы надо рассчитывать каждый раз, видимо?
Какая функция это делает быстро?
Надеялся обойтись без открытия каждого проверяемого файла.
← →
Dimka Maslov © (2013-08-26 18:04) [5]Забыл, что функция самописная:
function GetFileAge(FileName: String; Creation: Boolean;
Size: PInt64 = nil): TDateTime;
var
F: TWin32FindData;
H: HFILE;
T: TSystemTime;
begin
H := FindFirstFile(PChar(FileName), F);
if H = INVALID_HANDLE_VALUE then
Result := -1
else begin
Windows.FindClose(H);
if Creation then
FileTimeToLocalFileTime(F.ftCreationTime, F.ftLastAccessTime)
else
FileTimeToLocalFileTime(F.ftLastWriteTime, F.ftLastAccessTime);
FileTimeToSystemTime(F.ftLastAccessTime, T);
with T do Result := EncodeDate(wYear, wMonth, wDay) +
EncodeTime(wHour, wMinute, wSecond, wMilliseconds);
if Assigned(Size) then
Size^ := Int64(F.nFileSizeLow) or (Int64(F.nFileSizeHigh) shl 32);
end;
end;
По идее результаты должны быть одинаковыми. При существуют проблемы при сравнении вещественных чисел, а также возникать из-за разности времени на разных компьютерах. Контрольную сумму можно вычислять любую, например MD5. Существует множество функций, все они работают довольно шустро. При этом можно добиться, чтобы не вычислять контрольную сумму каждый раз, а имеено держать их в отдельных файлах и сравнивать их.
← →
Дмитрий (2013-08-27 18:40) [6]>Забыл, что функция самописная
))
То-то я не нашел ее в хелпе
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2014.06.29;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.002 c