Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1377774807
delphi.coder
2013-08-29 15:13
2014.06.29
работа с объктом TFieldDataLink


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


15-1386762986
azlk2141
2013-12-11 15:56
2014.06.29
выбор мобильного оператора


1-1326095552
solomon
2012-01-09 11:52
2014.06.29
Странность при работе с Record


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский