程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 利用Indy的TIdFtp控件實現FTP協議(4)

利用Indy的TIdFtp控件實現FTP協議(4)

編輯:Delphi

(6)上傳的實現

上傳的實現與下載類似,通過put方法即可。

過程說明:

procedure Put(const ASource: TStream; const ADestFile: string; const AAppend: boolean); overload;
procedure Put(const ASourceFile: string; const ADestFile: string; const AAppend: boolean); overload;

上傳文件至服務器

屬性說明:

const ASourceFile: string

將要被上傳的文件

const ADestFile: string = ''

服務器上的目標文件名

const AAppend: boolean = false

是否繼續上傳

代碼示例:

if IdFTP1.Connected then begin
if UploadOpenDialog1.Execute then try
IdFTP1.TransferType := ftBinary;
IdFTP1.Put(UploadOpenDialog1.FileName, ExtractFileName(UploadOpenDialog1.FileName));
//可以在此添加改變目錄的代碼;
finally
//完成清除工作
end;
end;

(7)刪除的實現

刪除文件使用Delete方法,該方法刪除指定的文件,刪除對象必須為文件。如果要刪除目錄則使用RemoveDir方法。

過程說明:

procedure Delete(const AFilename: string);

刪除文件

procedure RemoveDir(const ADirName: string);

刪除文件夾,根據不同的服務器刪除文件夾有不同的要求。有些服務器不允許刪除非空文件夾,程序員需要添加清空目錄的代碼。

上述兩個過程的參數均為目標名稱

代碼示例:

if not IdFTP1.Connected then exit;
Name := IdFTP1.DirectoryListing.Items[iCurrSelect].FileName;
if IdFTP1.DirectoryListing.Items[iCurrSelect].ItemType = ditDirectory then try
idFTP1.RemoveDir(Name);
finally
end
else
try
idFTP1.Delete(Name);
finally
end;

(8)後退的實現

後退在實際上是目錄操作的一種,可以簡單的改變當前目錄為..來實現,也可以通過回到上級目錄來實現。

(9)取消的實現

在IdFTP的傳輸過程中,可以隨時使用abort方法取消當前操作。可以的OnWork事件的實現中來確定何時取消操作。

代碼示例:

//取消按鈕的OnClick響應
procedure TMainForm.AbortButtonClick(Sender: TObject);
begin
AbortTransfer := true;
end;
//IdFTP的OnWork事件響應
procedure TMainForm.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
...
if AbortTransfer then IdFTP1.Abort;
AbortTransfer := false;
end;

(10)斷點續傳的實現

斷點續傳就是在上傳或下載過程開始時,判斷已經傳輸過的文件是否上傳輸完畢,如果傳輸沒有成功完成,則在上次中斷處繼續進行傳輸工作。實現該功能需要兩個重要的操作,首先是判斷文件的大小信息,其次是在傳輸過程Get和Put中指定上傳的行為。

判斷服務器上文件的大小使用函數Size(FileName)。在下載過程中,比較本地文件和遠程文件的信息,然後在Get中指定AResume := True即可。而上傳也一樣,指定Put的AAppend := True就可以了。

在前面我們講過,Indy的網絡操作大部分是阻塞模式的,TIdFTP也不例外。這樣在上述各個操作運行過程的時候用戶界面被暫時凍結,必須要等待調用返回才能繼續用戶操作界面響應。所以在實際編程中,需要使用多線程的方式來保證戶界面的響應。Windows系統可以使用CreateThread系統調用來創建線程,但是在使用的時候需要開發人員做很多額外的工作來保證線程的同步等問題。而Indy中也包含了實現多線程的控件TIdThreadComponent,相對比之下該控件實現多線程時更加方便,也更容易控制。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved