Проверка файла на изминение

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Проверка файла на изминение

Сообщение bogdan » 06.10.2015 14:29:38

Здравствуйте. Использую объект TFTPSend из пакета synapse. Как лучше всего сделать проверку совпадает ли ранее скаченный файл с тем который на сервере, что бы не качать лишнее?
bogdan
новенький
 
Сообщения: 40
Зарегистрирован: 20.05.2015 21:32:49

Re: Проверка файла на изминение

Сообщение Padre_Mortius » 06.10.2015 21:48:43

bogdan, если сервер ваш, то есть смысл на сервер положить файлик с md5/sha1 суммами и загружая его уже проводить сверку файлов и обновлять только нужные файлы.

Ну а если не ваш, то проводить сверку по дате и времени файла
Код: Выделить всё
procedure TMainForm.Synchronization(ftp: TFtpSend; ServerPath, LocalPath: AnsiString);
var
  i: integer;
  aName: AnsiString;
begin
  ftp.ChangeWorkingDir(ServerPath);
  ftp.List('', false);
  for i:=0 to ftp.FtpList.Count - 1 do
  begin
    Application.ProcessMessages;
    aName := ftp.FtpList.Items[i].FileName;
    if not ftp.FtpList.Items[i].Directory then
    begin
        if (not FileExistsUTF8(AppendPathDelim(LocalPath) + aName)) then
        // файл не найден в локальной папке
        begin
          ftp.DirectFile := true;
          ftp.DirectFileName := AppendPathDelim(LocalPath) + aName;
          if ftp.RetrieveFile(UTF8ToSys(aName), false) then ShowMessage('Файл ' + aName + ' успешно закачан.')
            else ShowMessage('Ошибка при загрузке файла. Код ошибки ' + ftp.ResultString);
          FileSetDateUTF8(ftp.DirectFileName, DateTimeToFileDate(ftp.FtpList.Items[i].FileTime));
        end else
          begin
            if (FileAgeUTF8(AppendPathDelim(LocalPath) + aName) <> DateTimeToFileDate(ftp.FtpList.Items[i].FileTime)) then
            begin
              ShowMessage('Обновление существующего файла ' + aName);
              ftp.DirectFile := true;
              ftp.DirectFileName := AppendPathDelim(LocalPath) + aName;
              ftp.RetrieveFile(UTF8ToSys(aName), false);
              FileSetDateUTF8(ftp.DirectFileName, DateTimeToFileDate(ftp.FtpList.Items[i].FileTime));
            end else
            if (FileSize(UTF8ToSys(AppendPathDelim(LocalPath) + aName)) <> ftp.FtpList.Items[i].FileSize) then
            begin
              ftp.DirectFile := true;
              ftp.DirectFileName := AppendPathDelim(LocalPath) + aName;
              if ftp.RetrieveFile(UTF8ToSys(aName), false) then ShowMessage('Файл ' + aName + ' успешно закачан.')
                else ShowMessage('Ошибка при загрузке файла. Код ошибки ' + ftp.ResultString);
              FileSetDateUTF8(ftp.DirectFileName, DateTimeToFileDate(ftp.FtpList.Items[i].FileTime));
            end;
          end;
      end;
  end;
  ftp.ChangeToRootDir;
end;

procedure TMainForm.AutoUpdate;
var
  ftpclient: TFtpSend;
begin
  try
    ftpclient := TFtpSend.Create;
    ftpclient.FtpList.Clear;
    ftpclient.BinaryMode := False;
    ftpclient.TargetHost := 'host';
    ftpclient.UserName := 'login';
    ftpclient.Password := 'pwd';
    ftpclient.TargetPort := cFtpProtocol;
    ftpclient.PassiveMode := true;
    if ftpclient.Login then
    begin
      Synchronization(ftpclient, 'ftp://192.168.0.1/pub/', 'c:\temp\');
      ftpclient.Logout;
    end else ShowMessage('Авторизация прошла не успешно: ' + ftpclient.ResultString);
  finally
    FreeAndNil(ftpclient);
  end;
end;


P.S. за 100%-ную работоспособность не ручаюсь, т.к. код старый (от 2011 года), но по идее должен работать
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Проверка файла на изминение

Сообщение bogdan » 11.10.2015 21:31:20

Спасибо! а чем конструкция
Код: Выделить всё
             
ftp.DirectFile := true;
ftp.DirectFileName := AppendPathDelim(LocalPath) + aName;
ftp.RetrieveFile(UTF8ToSys(aName), false);


отличается от
Код: Выделить всё
       
if pFTPClient.RetrieveFile(lcFilePathFtp, false) then
  pFTPClient.DataStream.SaveToFile(lcFilePathPc);//сохранили из потока на диск


?
bogdan
новенький
 
Сообщения: 40
Зарегистрирован: 20.05.2015 21:32:49

Re: Проверка файла на изминение

Сообщение Padre_Mortius » 12.10.2015 22:46:32

bogdan, разница только в том, как вы работаете с файлами (напрямую или через MemoryStream). Оба варианта будут работать, только в вашем случае свойство DirectFile должно быть всегда false
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Проверка файла на изминение

Сообщение bogdan » 14.10.2015 17:58:13

Спасибо!

Добавлено спустя 2 минуты 41 секунду:
И еще один вопросик но уже по потокам, как Вы правильно завершаете поток. Потому что если закрывать программу когда поток начинает обновление у меня выдает ошибку? Спасибо
bogdan
новенький
 
Сообщения: 40
Зарегистрирован: 20.05.2015 21:32:49


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 224

Рейтинг@Mail.ru