Конференция "Сети" » Отправка и приём файлов в FTP сервер [D7, WinXP]
 
  • Anatoly Podgoretsky © (16.11.11 12:24) [20]

    > Xmen   (16.11.11 11:18) [17]

    Трудно назвать Инди лучшим.
  • Anatoly Podgoretsky © (16.11.11 12:25) [21]

    > Indy тоже вполне нормально может работать.

    Но не у всех это получается.
  • Сергей М. © (16.11.11 12:29) [22]

    > Трудно назвать Инди лучшим


    "Эт точно" (с) Ф.Сухов

    Трижды подумать надо, прежде чем тянуть в проект этого глюкавого монстра ради тривиальной задачи под конкретную платформу
  • Xmen (18.11.11 14:48) [23]

    > Сергей М. ©   (16.11.11 11:39) [18]
    > > Это отдельная компонента?Это вообще не "компонента".В
    > юните ftpsend.pas есть довольно подробные комментарии по
    > использованию класса TFtpSend


    на этом юните сделал отправку и приём файлов.
    procedure TForm1.Button7Click(Sender: TObject);
    var dn, i:integer;
       F: TSearchRec;
    begin
      i:=0;
      chdir('D:\Send\');
      dn := FindFirst('*.*',faArchive,F);
      while dn = 0 do
        begin
          FTPClient.DataStream.LoadFromFile(f.Name);
          FTPClient.StoreFile(ExtractFileName(FTPClient.GetCurrentDir+'\Send\'+f.Name),false);
          FTPClient.
          DeleteFile(f.Name);
          Memo1.Lines.Add('Çàãðóæåí ôàéë: '+F.Name+' âðåìÿ çàêà÷êè: '+datetimetostr(NOW));
          inc(i);
          dn := FindNext(F);
        end;
     Memo1.Lines.Add('Óñïåøíî çàêà÷àííûõ ôàéëîâ: '+inttostr(i));
     refreshDir;
    end;

    procedure TForm1.Button8Click(Sender: TObject);
    var i:integer;
    begin
     for i := 0 to FTPClient.FtpList.Count-1 do
      begin
        try
          FTPClient.RetrieveFile(FTPClient.GetCurrentDir+'\Recv\'+FTPClient.FtpList[i].FileName,false);
          FTPClient.DataStream.SaveToFile('D:\RECV\'+FTPClient.FtpList[i].FileName);
          FTPClient.DeleteFile(FTPClient.GetCurrentDir+'\Recv\'+FTPClient.FtpList[i].FileName);
          Memo1.Lines.Add('Ñêà÷àí ôàéë: '+FTPClient.FtpList[i].FileName+' âðåìÿ: '+datetimetostr(NOW));
        except
          on E: Exception do ShowMessage('Îøèáêà ïðè ñêà÷èâàíèè ôàéëà %s'#13#10'class:%s'#13#10'%s'+FTPClient.FtpList[i].FileName);
        end;
      end;
     Memo1.Lines.Add('Óñïåøíî ñêà÷àííûõ ôàéëîâ: '+inttostr(FTPClient.FtpList.Count));
     refreshDir;
    end;

    Теперь нужно организовать процесс процента закачки и скачки через прогрессбар. Как это можно сделать в ftpsend е
  • Сергей М. © (18.11.11 15:17) [24]
    unit blcksock
    ..
    TBlockSocket
    ..
       {:This event is called by various reasons. It is good for monitoring socket,
        create gauges for data transfers, etc.}
       property OnStatus: THookSocketStatus read FOnStatus write FOnStatus;
  • Xmen (18.11.11 16:18) [25]

    > Сергей М. ©   (18.11.11 15:17) [24]
    > unit blcksock..TBlockSocket..    {:This ev
    stacktrace: n/a; see  opera:config#UserPrefs|Exceptions Have Stacktraceent is called
    > by v
    stacktrace: n/a; see  opera:config#UserPrefs|Exceptions Have Stacktracearious reasons. It is good for monitoring socket,  
    >   create gauges for data transfers, etc.}    property OnStatus:
    >  THookSocketStatus read FOnStatus write FOnStatus;


    Спасибо.
    как это в коде реализовать?
    (уже начинаю тупеть)
  • Xmen (13.12.11 14:55) [26]
    Вновь вернулся на этот вопрос.
    Создал код и оно работает. Но не могу понять вот если соединения разорвался в ФТП отправлен файл но не полностью как там в ФТП узнать что этот файл неполный то есть я должен скопировать эту папку с файлами и не должен скопировать такие файлы.
  • Anatoly Podgoretsky © (13.12.11 15:10) [27]
    По протоколу разрыв соединения есть признак окончания передачи. Поэтому на FTP серверах рядом с файлом помещают файл с контрольной суммой.
  • Xmen (13.12.11 15:14) [28]

    > Anatoly Podgoretsky ©   (13.12.11 15:10) [27]
    > По протоколу разрыв соединения есть признак окончания передачи.
    >  Поэтому на FTP серверах рядом с файлом помещают файл с
    > контрольной суммой.

    Сейчас проверю
  • Xmen (13.12.11 15:19) [29]
    Сервер FileZila клиент Total отправил 2 гига файла и отменил копирование. Поискал этот файл с контрольной суммой но не нашел. Где искать надо?
    У меня есть клиент на Delphi.
  • Anatoly Podgoretsky © (13.12.11 15:26) [30]
    Ты его сам должен послать, автоматом это не делается.
  • Xmen (13.12.11 15:40) [31]
    То есть как?
    Путём сравнения файла?
    Помогите еще ...
  • Anatoly Podgoretsky © (13.12.11 16:00) [32]
    > Xmen  (13.12.2011 15:40:31)  [31]

    Очень просто, на сервер отсылаются два файла, а при считывании расчитывается
    новая контрольная суммв, если она не совпадает, то ошибка передачи.
  • Xmen (13.12.11 16:14) [33]
    То есть я сначала пишу контрольную сумму в файл и скопирую файл с текстом контрольной суммой в FTP. Потом идет сравнение файла.
  • Anatoly Podgoretsky © (13.12.11 16:25) [34]
    > Xmen  (13.12.2011 16:14:33)  [33]

    Нет файлы (оба) тоже надо отправить на сервер
  • Xmen (13.12.11 16:44) [35]

    > Anatoly Podgoretsky ©   (13.12.11 16:25) [34]
    > > Xmen  (13.12.2011 16:14:33)  [33]Нет файлы (оба) тоже
    > надо отправить на сервер

    Да уважаемый гуру я это понял, наверно сначала должен отправит контрольный файл а потом сам файл. Когда копирую с ФТП сначала идет сравнение а потом копирование и удаление контрольного файла или когда закачка на сервер файла закончена то удаляю контрольный файл.
  • Anatoly Podgoretsky © (13.12.11 16:48) [36]
    > Xmen  (13.12.2011 16:44:35)  [35]

    Конечно первым контрольный файл.
    Копирование идет всегда, иначе сравнение не возможно.
    На сервере файл не надо удалять.
  • Xmen (15.12.11 11:35) [37]
    Можете проверит сделал так.

    var dn, i, j:integer;
       F: TSearchRec;
       MyFile:TextFile;
       newFile, ftpFileName:string;
       ftpFileSize:Integer;
    begin
    LogFTP;//процедура соединение с сервером
    if FTPStatus=1 then
    if ListView3.Items.Count>0 then
      begin
        i:=0;
        ProgressBar2.Max:= ListView3.Items.Count-1;
        ProgressBar2.Min := 0;
        ProgressBar2.Position := 0;
        Memo1.Lines.Add('Открыт соединение с сервером');
        dn := FindFirst(path+'Send\*.*',faArchive,F);
        while dn = 0 do
          begin
            ProgressBar1.Position := 0;
            TotalBytes :=F.Size;
            newFile:=copy(f.Name,1,Length(f.Name)-4)+'.crc';
            AssignFile(MyFile,path+'Send\'+newFile);//создания файла проверки
            try
              Rewrite(MyFile);
              Write(MyFile,TotalBytes);
            finally
              CloseFile(MyFile);
              FTPClient.DataStream.LoadFromFile(path+'Send\'+newFile);
              FTPClient.StoreFile(ExtractFileName(FTPClient.GetCurrentDir+'Send/'+NewFile), false);
            end;
            FTPClient.DSock.OnStatus := SockPutCallBack;
            FTPClient.DataStream.LoadFromFile(path+'Send\'+f.Name);
            Memo1.Lines.Add('Отправка файла:   ' + f.Name+'      Размер:   ' + IntToStr(TotalBytes));
            if FTPClient.StoreFile(ExtractFileName(FTPClient.GetCurrentDir+'Send/'+f.Name), false) = true then
              begin
                FTPClient.List(FTPClient.GetCurrentDir+'/Send/',false);
                for j := 0 to FTPClient.FtpList.Count-1 do
                  begin
                   ftpFileName:= FTPClient.FtpList[j].FileName ;
                   ftpFileSize:= FTPClient.FileSize(FTPClient.GetCurrentDir+'Send/'+FTPClient.FtpList[j].FileName);;//если в сервер закачан файл и его размер подходит то ..
                   if (ftpFileName=f.Name) and (TotalBytes = ftpFileSize) then
                    begin
                      Memo1.Lines.Add('Загружен файл: '+F.Name+' время закачки: '+datetimetostr(NOW));
                      inc(i);
                      DeleteFile(path+'Send\'+f.Name);
                      DeleteFile(path+'Send\'+NewFile);
                      Break;
                    end;
                  end;
                ProgressBar1.Position := 0;
                Update;
              end
            else Memo1.lines.add('Ошибка отправки');
            ProgressBar2.Position := ProgressBar2.Position + 1;
            dn := FindNext(F);
          end;
        Memo1.Lines.Add('Успешно закачанных файлов: '+inttostr(i));
        Memo1.Lines.Add('Соединение закрыто');
        ProgressBar2.Position :=0;
      end;
    LogoutFTP;
    end;


    Это для отправки в сервер.
  • Anatoly Podgoretsky © (15.12.11 12:24) [38]
    > Xmen  (15.12.2011 11:35:37)  [37]

    > ftpFileSize:=
    > FTPClient.FileSize(FTPClient.GetCurrentDir+'Send/'+FTPClient.FtpList[j].FileName);;//если
    > в сервер закачан файл и его размер подходит то ..

    Это не гарантирует целостности файла
  • Xmen (15.12.11 13:24) [39]
    а как нужно тогда правильно сделать
 
Конференция "Сети" » Отправка и приём файлов в FTP сервер [D7, WinXP]
Есть новые Нет новых   [134435   +16][b:0][p:0.003]