(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,相對比之下該控件實現多線程時更加方便,也更容易控制。