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

Вниз

обновление по дате изменения файла   Найти похожие ветки 

 
Дмитрий   (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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.009 c
2-1373372132
Разведка
2013-07-09 16:15
2014.06.29
не преодолимый глюк


15-1387103920
Cobalt
2013-12-15 14:38
2014.06.29
copy-on-write 8-bit строки


2-1377509988
Viktor
2013-08-26 13:39
2014.06.29
ssShift + vk_numpad1


15-1386952352
Kipan
2013-12-13 20:32
2014.06.29
GDI


15-1386937387
Никифиров И.В.
2013-12-13 16:23
2014.06.29
Виджеты для смарт-тв Самсунг