欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

asp.net TIDFtp用法介紹

 更新時(shí)間:2011年07月11日 20:48:55   作者:  
現(xiàn)在很多應(yīng)用都需要上傳與下載大型文件,通過HTTP方式上傳大文件有一定的局限性。幸好FTP作為一個(gè)非常老而且非常成熟的協(xié)議可以高效穩(wěn)定地完成大文件的上傳下載,并且可以完美地實(shí)現(xiàn)續(xù)傳。
1 連接遠(yuǎn)程服務(wù)器
procedure Connect(AAutoLogin: boolean; const ATimeout: Integer);
2 改變目錄
procedure ChangeDir(const ADirName: string);
3 下載
procedure Get(const ASourceFile: string; ADest: TStream; AResume: Boolean); overload;
procedure Get(const ASourceFile: string; const ADestFile: string; const ACanOverwrite: boolean; AResume: Boolean); overload;
4 上傳
procedure Put(const ASource: TStream; const ADestFile: string; const AAppend: boolean); overload;
procedure Put(const ASourceFile: string; const ADestFile: string; const AAppend: boolean); overload;
5 刪除
procedure Delete(const AFilename: string);


判斷是否連接
if IdFTP1.Connected then
begin
...........
end;

引用別人一下,做為自己以后筆記

現(xiàn)在很多應(yīng)用都需要上傳與下載大型文件,通過HTTP方式上傳大文件有一定的局限性。幸好FTP作為一個(gè)非常老而且非常成熟的協(xié)議可以高效穩(wěn)定地完成大文件的上傳下載,并且可以完美地實(shí)現(xiàn)續(xù)傳。就拿我寫的電影服務(wù)器管理端程序來說,各種方案比較后,發(fā)現(xiàn)使用FTP可以完美地實(shí)現(xiàn)要求。但是要通過WinSocket庫實(shí)現(xiàn)FTP比較麻煩,幸好有Indy--一個(gè)包裝了大多數(shù)網(wǎng)絡(luò)協(xié)議的組件包。
通過Indy,程序設(shè)計(jì)人員可以通過阻塞方式進(jìn)行編程,可以拋開蹩腳的Winsocket異步模式,采用與Unix系統(tǒng)上等同的阻塞編程模式進(jìn)行。這樣,程序員就可以很好的處理程序的運(yùn)行流程。
下面,我們進(jìn)入到Indy的TIdFtp世界。

1.控件的說明

使用Indy 9中的TIdFtp控件可以實(shí)現(xiàn)通過FTP方式進(jìn)行文件的上傳與下載。

2.控件的具體使用

(1)控件屬性設(shè)置

默認(rèn)屬性即可,與服務(wù)器連接直接相關(guān)的屬性如主機(jī)名與用戶等在建立連接時(shí)進(jìn)行設(shè)定。需要設(shè)定的是RecvBufferSize和SendBufferSize兩屬性的值。另外需要根據(jù)要傳輸?shù)奈募愋椭付═ransferType屬性,而其他屬性按默認(rèn)值設(shè)定即可。

RecvBufferSize說明(默認(rèn)值為8192字節(jié)):該屬性為整型變量,用于指定連接所用的接受緩沖區(qū)大小。

SendBufferSize說明(默認(rèn)值為32768字節(jié)):該屬性也為整型變量,用于指定連接所用的發(fā)送緩沖區(qū)的最大值。該屬性在WriteStream方法中時(shí),可用于TStream指定要發(fā)送內(nèi)容的塊數(shù)。如果要發(fā)送的內(nèi)容大于本屬性值,則發(fā)送內(nèi)容被分為多個(gè)塊發(fā)送。

TransferType說明(默認(rèn)值為ftBinary):該屬性為TIdFTPTransferType型變量。用于指定傳輸內(nèi)容是二進(jìn)制文件(ftBinary )還是ASCII文件(ftASCII)。應(yīng)用程序需要使用二進(jìn)制方式傳輸可執(zhí)行文件、壓縮文件和多媒體文件等;而使用ASCII方式傳輸文本或超文本等文本型數(shù)據(jù)。

(2)控件的事件響應(yīng)

OnDisconnected響應(yīng):TNotifyEvent類,用于響應(yīng)斷開(disconnect)事件。當(dāng)Disconnect方法被調(diào)用用來關(guān)閉Socket的時(shí)候,觸發(fā)該響應(yīng)。應(yīng)用程序必須指定該事件響應(yīng)的過程,以便對(duì)該斷開事件進(jìn)行相應(yīng)。

OnStatus響應(yīng):TIdStatusEvent類。該響應(yīng)在當(dāng)前連接的狀態(tài)變化時(shí)被觸發(fā)。該事件可由DoStatus方法觸發(fā)并提供給事件控制器屬性。axStatus是當(dāng)前連接的TIdStatus值;aaArgs是一個(gè)可選的參數(shù)用于格式化函數(shù),它將用于構(gòu)造表現(xiàn)當(dāng)前連接狀態(tài)的文本消息。

OnWork響應(yīng):OnWord是TWorkEvent類事件的響應(yīng)控制器。OnWork用于關(guān)聯(lián)DoWork方法當(dāng)緩沖區(qū)讀寫操作被調(diào)用時(shí)通知Indy組件和類。它一般被用于控制進(jìn)度條和視窗元素的更新。AWorkMode表示當(dāng)前操作的模式,其中:wmRead-組件正在讀取數(shù)據(jù);wmWrite-組件正在發(fā)送數(shù)據(jù)。AWorkCount指示當(dāng)前操作的字節(jié)計(jì)數(shù)。

OnWorkBegin響應(yīng):TWorkBeginEvent類。當(dāng)緩沖區(qū)讀寫操作初始化時(shí),該事件關(guān)聯(lián)BeginWork方法用于通知Indy組件和類。它一般被用于控制進(jìn)度條和視窗元素的更新。AWorkMode表示當(dāng)前操作的模式,其中:wmRead-組件正在讀取數(shù)據(jù);wmWrite-組件正在發(fā)送數(shù)據(jù)。AWorkCountMax用于指示發(fā)送到OnWorkBegin事件的操作的最大字節(jié)數(shù),0值代表未知。

OnWorkEnd響應(yīng):TWorkEndEvent類。當(dāng)緩沖區(qū)讀寫操作終止時(shí),該事件關(guān)聯(lián)EndWork方法用于通知Indy組件和類。AWorkMode表示當(dāng)前操作的模式,其中:wmRead-組件正在讀取數(shù)據(jù);wmWrite-組件正在發(fā)送數(shù)據(jù)。AWorkCount表示操作的字節(jié)數(shù)。

在事件響應(yīng)中,主要通過上述五種事件響應(yīng)來控制程序。在一般情況下,在OnDisconnected中設(shè)定連接斷開的界面通知;在OnStatus中設(shè)定當(dāng)前操作的狀態(tài);在OnWork中實(shí)現(xiàn)傳輸中狀態(tài)條和其他參數(shù)的顯示;而在OnWorkBegin和OnWorkEnd中分別設(shè)定開始傳輸和傳輸結(jié)束時(shí)的界面。

(3)連接遠(yuǎn)程服務(wù)器

完成了設(shè)定控件屬性和實(shí)現(xiàn)了控件的事件響應(yīng)后,就可以與服務(wù)器進(jìn)行交互和傳輸了。在連接之前,應(yīng)首先判斷IdFtp是否處于連接狀態(tài),如果Connected為False,則通過界面控件或其他方式指定與服務(wù)器連接相關(guān)的一些TCP類屬性的設(shè)置,分別是:Host(主機(jī)名):String、Username(用戶名):String、Password(密碼):String,也可以指定Port(端口)。之后調(diào)用Connect方法連接遠(yuǎn)程服務(wù)器,如果無異常出現(xiàn)則連接成功建立。

過程說明:procedure Connect(AAutoLogin: boolean; const ATimeout: Integer);

該過程連接遠(yuǎn)程FTP服務(wù)器

屬性:AAutoLogin: boolean = True

連接后自動(dòng)登錄,該參數(shù)默認(rèn)為True。

const ATimeout: Integer = IdTimeoutDefault

超時(shí)時(shí)間,單位:秒。

示例代碼:

if IdFTP1.Connected then try

if TransferrignData then IdFTP1.Abort;

IdFTP1.Quit;

finally

end

else with IdFTP1 do try

Username := UserIDEdit.Text;

Password := PasswordEdit.Text;

Host := FtpServerEdit.Text;

Connect;

ChangeDir(CurrentDirEdit.Text);

finally

end;

(4)改變目錄

連接建立后,可以改變當(dāng)前FTP會(huì)話所在的目錄。對(duì)于已知絕對(duì)路徑的情況下,可以直接調(diào)用ChangeDir(const ADirName: string)方法來轉(zhuǎn)換目錄,ADirName表示服務(wù)器上的文件系統(tǒng)目錄,另外還可以調(diào)用ChangeDirUp回到上級(jí)目錄。

如果未知路徑,則可以通過List(ADest: TStrings; const ASpecifier: string; const ADetails: boolean)過程獲取遠(yuǎn)程服務(wù)器的當(dāng)前目錄結(jié)構(gòu),此時(shí)必須設(shè)定TransferType為ftASCII(ASCII模式),其中:ADest保存當(dāng)前目錄結(jié)構(gòu),可以在后續(xù)程序中調(diào)用該列表。另外可以通過RetrieveCurrentDir方法獲取當(dāng)前目錄名。

過程說明:

procedure ChangeDir(const ADirName: string);

改變工作目錄

屬性

const ADirName: string

遠(yuǎn)程服務(wù)器的目錄描述

說明:該過程實(shí)際上是實(shí)現(xiàn)了FTP CWD命令。

procedure ChangeDirUp;

到上一級(jí)目錄

function RetrieveCurrentDir: string;

該函數(shù)返回當(dāng)前目錄名

procedure List(ADest: TStrings; const ASpecifier: string; const ADetails: boolean);

列出當(dāng)前目錄所有文件和子目錄及其屬性

參數(shù):

ADest: TStrings

保存文件及子目錄的返回結(jié)果

const ASpecifier: string =

文件掩碼,用于列出符合條件的文件

const ADetails: boolean = true

包含文件和子目錄屬性

property DirectoryListing: TIdFTPListItems;

返回文件及目錄結(jié)構(gòu)的列表

示例代碼:

LS := TStringList.Create;

try

IdFTP1.ChangeDir(DirName);

IdFTP1.TransferType := ftASCII;

CurrentDirEdit.Text := IdFTP1.RetrieveCurrentDir;

DirectoryListBox.Items.Clear;

IdFTP1.List(LS);

DirectoryListBox.Items.Assign(LS);

if DirectoryListBox.Items.Count > 0 then

if AnsiPos(total, DirectoryListBox.Items[0]) > 0 then DirectoryListBox.Items.Delete(0);

finally

LS.Free;

end;

(5)下載的實(shí)現(xiàn)

在下載之前,必須查看DirectoryListing.Items[sCurrFile].ItemType是否為文件,如返回為ditDirectory則代表當(dāng)前文件名為目錄,不能下載,必須導(dǎo)向到文件才可。如為文件,則可以進(jìn)行下載。在下載前,設(shè)定傳輸?shù)念愋蜑槎M(jìn)制文件,并且指定本地要保存的路徑。通過調(diào)用Get方法,實(shí)現(xiàn)文件的下載。下載過程較慢,可以考慮將其放到線程中實(shí)現(xiàn)。

過程說明:

procedure Get(const ASourceFile: string; ADest: TStream; AResume: Boolean); overload;

procedure Get(const ASourceFile: string; const ADestFile: string; const ACanOverwrite: boolean; AResume: Boolean); overload;

從遠(yuǎn)程服務(wù)器上獲取文件。

屬性說明:

const ASourceFile: string

遠(yuǎn)程服務(wù)器上的源文件名

const ADestFile: string

保存到客戶機(jī)上的文件名

const ACanOverwrite: boolean = false

重寫同名文件

AResume: Boolean = false

是否進(jìn)行斷點(diǎn)續(xù)傳

示例代碼:

SaveDialog1.FileName := Name;

if SaveDialog1.Execute then begin

SetFunctionButtons(false);

IdFTP1.TransferType := ftBinary;

BytesToTransfer := IdFTP1.Size(Name);

if FileExists(Name) then begin

case MessageDlg(File aready exists. Do you want to resume the download operation?,

mtConfirmation, mbYesNoCancel, 0) of

mrYes: begin

BytesToTransfer := BytesToTransfer - FileSizeByName(Name);

IdFTP1.Get(Name, SaveDialog1.FileName, false, true);

end;

mrNo: begin

IdFTP1.Get(Name, SaveDialog1.FileName, true);

end;

mrCancel: begin

exit;

end;

end;

end

else begin

IdFTP1.Get(Name, SaveDialog1.FileName, false);

end;

(6)上傳的實(shí)現(xiàn)

上傳的實(shí)現(xiàn)與下載類似,通過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;

上傳文件至服務(wù)器

屬性說明:

const ASourceFile: string

將要被上傳的文件

const ADestFile: string =

服務(wù)器上的目標(biāo)文件名

const AAppend: boolean = false

是否繼續(xù)上傳

代碼示例:

if IdFTP1.Connected then begin

if UploadOpenDialog1.Execute then try

IdFTP1.TransferType := ftBinary;

IdFTP1.Put(UploadOpenDialog1.FileName, ExtractFileName(UploadOpenDialog1.FileName));

//可以在此添加改變目錄的代碼;

finally

//完成清除工作

end;

end;

(7)刪除的實(shí)現(xiàn)

刪除文件使用Delete方法,該方法刪除指定的文件,刪除對(duì)象必須為文件。如果要?jiǎng)h除目錄則使用RemoveDir方法。

過程說明:

procedure Delete(const AFilename: string);

刪除文件

procedure RemoveDir(const ADirName: string);

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

上述兩個(gè)過程的參數(shù)均為目標(biāo)名稱

代碼示例:

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)后退的實(shí)現(xiàn)

后退在實(shí)際上是目錄操作的一種,可以簡單的改變當(dāng)前目錄為..來實(shí)現(xiàn),也可以通過回到上級(jí)目錄來實(shí)現(xiàn)。

(9)取消的實(shí)現(xiàn)

在IdFtp的傳輸過程中,可以隨時(shí)使用abort方法取消當(dāng)前操作??梢缘腛nWork事件的實(shí)現(xiàn)中來確定何時(shí)取消操作。

代碼示例:

//取消按鈕的OnClick響應(yīng)

procedure TMainForm.AbortButtonClick(Sender: TObject);

begin

AbortTransfer := true;

end;

//IdFTP的OnWork事件響應(yīng)

procedure TMainForm.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;

const AWorkCount: Integer);

begin

...

if AbortTransfer then IdFTP1.Abort;

AbortTransfer := false;

end;

(10)斷點(diǎn)續(xù)傳的實(shí)現(xiàn)

斷點(diǎn)續(xù)傳就是在上傳或下載過程開始時(shí),判斷已經(jīng)傳輸過的文件是否上傳輸完畢,如果傳輸沒有成功完成,則在上次中斷處繼續(xù)進(jìn)行傳輸工作。實(shí)現(xiàn)該功能需要兩個(gè)重要的操作,首先是判斷文件的大小信息,其次是在傳輸過程Get和Put中指定上傳的行為。

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

在前面我們講過,Indy的網(wǎng)絡(luò)操作大部分是阻塞模式的,TIdFtp也不例外。這樣在上述各個(gè)操作運(yùn)行過程的時(shí)候用戶界面被暫時(shí)凍結(jié),必須要等待調(diào)用返回才能繼續(xù)用戶操作界面響應(yīng)。所以在實(shí)際編程中,需要使用多線程的方式來保證戶界面的響應(yīng)。Windows系統(tǒng)可以使用CreateThread系統(tǒng)調(diào)用來創(chuàng)建線程,但是在使用的時(shí)候需要開發(fā)人員做很多額外的工作來保證線程的同步等問題。而Indy中也包含了實(shí)現(xiàn)多線程的控件TIdThreadComponent,相對(duì)比之下該控件實(shí)現(xiàn)多線程時(shí)更加方便,也更容易控制。我將在后續(xù)的文章里為大家介紹TIdThreadCOmponent的使用方法

相關(guān)文章

最新評(píng)論