2016-01-03 130 views
2

我試圖創建一個函數來檢查是否存在一個文件夾使用Overbyte ICS FTP component.Using從icsftp DIR命令不會在我的筆記顯示什麼登錄。 我有興趣將dir命令的結果解析爲字符串列表以搜索特定的文件夾。ICS FTP - 檢查功能如果FTP服務器上存在的文件夾

目前我使用這樣的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; 

回答

1

我假設您使用的是最新發布的版本OverbyteIcs (ICS-V8.16 (Apr, 2015))

如果你只需要檢查,如果遠程目錄存在它在其他的答案,以避免列表中提到一個很好的建議(這可能是一個耗時的操作是否返回了大量文件和文件夾)。

我建議你只是試着去「樂觀」,然後改成你想用FTP.Cwd進行調查的遠程目錄。如果此調用返回true,則該文件夾當然存在,並且如果您打算繼續使用同一個客戶端,則必須更改回原始目錄。另一方面,如果呼叫失敗,如果ftp服務器響應代碼550,則目錄不存在。

我已經包含了一個簡單的示例做上述(但是,它不提供「變回至原來的-DIR-上的成功」功能):

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; 
+0

外觀極好的解決方案!我發佈的indy函數花費了大約2秒的時間,並根據ftp文件和文件夾的數量進行解析。你的解決方案是完美的!感謝你們對我的幫助! – user2858981

+0

@ user2858981很高興聽到:) –

1

您更好地使用如下命令SIZETFtpClient.Size)或MLSTTFtpClient.Mlst)來檢查文件是否存在。

使用LIST是相當矯枉過正。