Я пытаюсь создать функцию, чтобы проверить, существует ли папка с помощью компонента FTP Overbyte ICS. Использование команды DIR из icsftp ничего не отображает в моем журнале заметок. Меня интересует анализ результата команды dir в строковом списке для поиска определенной папки.

На данный момент я использую такую ​​функцию indy. Как я могу сделать то же самое с ICS?

function exista_textul_in_stringlist(const stringul_pe_care_il_caut:string; stringlistul_in_care_efectuez_cautarea:Tstringlist):boolean;

begin
if stringlistul_in_care_efectuez_cautarea.IndexOf(stringul_pe_care_il_caut) = -1 then
begin
  result:=false;
  //showmessage('Textul "'+text+'" nu exista!' );
end
else
begin

 result:=true;
 //showmessage('Textul "'+text+'" exista la pozitia '+ inttostr(ListBox.Items.IndexOf(text)));
end;
end;

    function folder_exists_in_ftp(folder_name_to_search_for,ftp_hostname,ftp_port,ftp_username,ftp_password,ftp_root_folder:string;memo_loguri:Tmemo):boolean;
    Var
     DirList : TStringList;
     ftp:Tidftp;
     antifreeze:TidAntifreeze;
     var i,k:integer;
    begin
     dateseparator:='-';
     Result := False;
     DirList := TStringList.Create;
     ftp:=tidftp.Create;
     antifreeze:=TidAntifreeze.Create;
     try
        antifreeze.Active:=true;
        ftp.Host:=ftp_hostname;
        ftp.Port:=strtoint(ftp_port);
        ftp.username:=ftp_username;
        ftp.password:=ftp_password;
        ftp.Passive:=true;
        ftp.Connect;

     ftp.ChangeDir(ftp_root_folder);
     ftp.List(DirList, folder_name_to_search_for, True);


      if DirList.Count > 0 then begin
          k := DirList.Count;
          DirList.Clear; // DIRLIST will hold folders only
          for i := 0 to k - 1 do begin
            if (ftp.DirectoryListing.Items[i].FileName <> '.') and (ftp.DirectoryListing.Items[i].FileName <> '..') then begin
              if ftp.DirectoryListing.Items[i].ItemType = ditDirectory then begin
                DirList.Add(ftp.DirectoryListing.Items[i].FileName);
              end;
            end;
          end;
      end;
        if exista_textul_in_stringlist(folder_name_to_search_for,DIRLIST) then
      begin
      Result := True;
      memo_loguri.Lines.Add(datetimetostr(now)+' - caut folderul "'+folder_name_to_search_for+'" in directorul ftp "'+ftp_root_folder+'" => EXISTS!');
      end

      ELSE
      begin
      result:=false;
      memo_loguri.Lines.Add(datetimetostr(now)+' - caut folderul "'+folder_name_to_search_for+'" in directorul ftp "'+ftp_root_folder+'" => NOT exists!');
      end;
     finally
      ftp.Free;
      antifreeze.Free;
      DirList.Free;
     end;

    end;
2
user2858981 3 Янв 2016 в 17:38

2 ответа

Лучший ответ

Я предполагаю, что вы используете последнюю выпущенную версию OverbyteIcs (ICS-V8.16 (апрель 2015 г.)) .

Если вам просто нужно проверить, существует ли удаленный каталог, это хорошая рекомендация, упомянутая в другом ответе, чтобы избежать списка (это может занять много времени, если возвращается много файлов и папок).

Я предлагаю вам просто проявить "оптимизм" и перейти на удаленный каталог, который вы хотите исследовать, используя FTP.Cwd. Если этот вызов возвращает истину, папка, конечно, существует, и если вы планируете продолжить работу с тем же клиентом, вам нужно вернуться к исходному каталогу. С другой стороны, если вызов терпит неудачу, каталог не существует, если ftp-сервер отвечает кодом 550.

Я включил простой пример, выполняющий описанное выше (однако он не предоставляет возможности «вернуться к исходному каталогу при успехе»):

uses
  ...
  OverbyteIcsFtpCli;

function FtpRemoteDirExists( 
                           HostName: String; 
                           UserName: String; 
                           Password: String; 
                           HostDirToCheck : String ) : Boolean;
const
  cFtpCode_FileOrDirNotExists = 550;
var
  FTP: TFtpClient;
begin
  FTP := TFtpClient.Create(nil);
  try
    FTP.HostName := HostName;
    FTP.Passive := True;
    FTP.Binary := True;
    FTP.Username := UserName;
    FTP.Password := Password;
    FTP.Port := '21';

    if not FTP.Open then
      raise Exception.Create('Failed to connect: ' + FTP.ErrorMessage);

    if (not FTP.User) or (not FTP.Pass) then
      raise Exception.Create('Failed to login: ' + FTP.ErrorMessage);

    FTP.HostDirName := HostDirToCheck;
    if FTP.Cwd then
      Result := True
    else
    begin
      if FTP.StatusCode = cFtpCode_FileOrDirNotExists then
        Result := False
      else
        raise Exception.Create('Failed to change dir: ' + FTP.ErrorMessage);
    end;

  finally
    FTP.Free;
  end;
end;
1
Christian Holm Jørgensen 3 Янв 2016 в 20:36

Лучше использовать такую ​​команду, как SIZE (TFtpClient.Size) или MLST (TFtpClient.Mlst), чтобы проверить наличие файла.

Использование LIST - это перебор.

1
Martin Prikryl 3 Янв 2016 в 15:15