日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

简单的FTP应用程序

發(fā)布時(shí)間:2024/6/5 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简单的FTP应用程序 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
下面的幾個(gè)步驟包括了使用FtpWebRequest類實(shí)現(xiàn)ftp功能的一般過程

1、創(chuàng)建一個(gè)FtpWebRequest對(duì)象,指向ftp服務(wù)器的uri
2、設(shè)置ftp的執(zhí)行方法(上傳,下載等)
3、給FtpWebRequest對(duì)象設(shè)置屬性(是否支持ssl,是否使用二進(jìn)制傳輸?shù)?#xff09;
4、設(shè)置登錄驗(yàn)證(用戶名,密碼)
5、執(zhí)行請(qǐng)求
6、接收相應(yīng)流(如果需要的話)
7、如果沒有打開的流,則關(guān)閉ftp請(qǐng)求

開發(fā)任何ftp應(yīng)用程序都需要一個(gè)相關(guān)的ftp服務(wù)器及它的配置信息。FtpWebRequest暴露了一些屬性來(lái)設(shè)置這些信息。

接下來(lái)的代碼示例了上傳功能

首先設(shè)置一個(gè)uri地址,包括路徑和文件名。這個(gè)uri被使用在FtpWebRequest實(shí)例中。

然后根據(jù)ftp請(qǐng)求設(shè)置FtpWebRequest對(duì)象的屬性

其中一些重要的屬性如下:
????·Credentials?-?指定登錄ftp服務(wù)器的用戶名和密碼。
????·KeepAlive?-?指定連接是應(yīng)該關(guān)閉還是在請(qǐng)求完成之后關(guān)閉,默認(rèn)為true
????·UseBinary?-?指定文件傳輸?shù)念愋汀S袃煞N文件傳輸模式,一種是Binary,另一種是ASCII。兩種方法在傳輸時(shí),字節(jié)的第8位是不同的。ASCII使用第8位作為錯(cuò)誤控制,而Binary的8位都是有意義的。所以當(dāng)你使用ASCII傳輸時(shí)要小心一些。簡(jiǎn)單的說,如果能用記事本讀和寫的文件用ASCII傳輸就是安全的,而其他的則必須使用Binary模式。當(dāng)然使用Binary模式發(fā)送ASCII文件也是非常好的。
????·UsePassive?-?指定使用主動(dòng)模式還是被動(dòng)模式。早先所有客戶端都使用主動(dòng)模式,而且工作的很好,而現(xiàn)在因?yàn)榭蛻舳朔阑饓Φ拇嬖?#xff0c;將會(huì)關(guān)閉一些端口,這樣主動(dòng)模式將會(huì)失敗。在這種情況下就要使用被動(dòng)模式,但是一些端口也可能被服務(wù)器的防火墻封掉。不過因?yàn)閒tp服務(wù)器需要它的ftp服務(wù)連接到一定數(shù)量的客戶端,所以他們總是支持被動(dòng)模式的。這就是我們?yōu)槭裁匆褂帽粍?dòng)模式的原意,為了確保數(shù)據(jù)可以正確的傳輸,使用被動(dòng)模式要明顯優(yōu)于主動(dòng)模式。(譯者注:主動(dòng)(PORT)模式建立數(shù)據(jù)傳輸通道是由服務(wù)器端發(fā)起的,服務(wù)器使用20端口連接客戶端的某一個(gè)大于1024的端口;在被動(dòng)(PASV)模式中,數(shù)據(jù)傳輸?shù)耐ǖ赖慕⑹怯蒄TP客戶端發(fā)起的,他使用一個(gè)大于1024的端口連接服務(wù)器的1024以上的某一個(gè)端口)
????·ContentLength?-?設(shè)置這個(gè)屬性對(duì)于ftp服務(wù)器是有用的,但是客戶端不使用它,因?yàn)镕tpWebRequest忽略這個(gè)屬性,所以在這種情況下,該屬性是無(wú)效的。但是如果我們?cè)O(shè)置了這個(gè)屬性,ftp服務(wù)器將會(huì)提前預(yù)知文件的大小(在upload時(shí)會(huì)有這種情況)
????·Method?-?指定當(dāng)前請(qǐng)求是什么命令(upload,download,filelist等)。這個(gè)值定義在結(jié)構(gòu)體WebRequestMethods.Ftp中。
private?void?Upload(string?filename)
{
????FileInfo?fileInf?
=?new?FileInfo(filename);
????
string?uri?=?"ftp://"?+?ftpServerIP?+&???+?fileInf.Name;
????FtpWebRequest?reqFTP;?

????
//?根據(jù)uri創(chuàng)建FtpWebRequest對(duì)象?
????reqFTP?=?(FtpWebRequest)FtpWebRequest.Create(new?Uri("ftp://"?+?ftpServerIP?+???;+?fileInf.Name));?

????
//?ftp用戶名和密碼
????reqFTP.Credentials?=?new?NetworkCredential(ftpUserID,?ftpPassword);?

????
//?默認(rèn)為true,連接不會(huì)被關(guān)閉
????
//?在一個(gè)命令之后被執(zhí)行
????reqFTP.KeepAlive?=?false;?

????
//?指定執(zhí)行什么命令
????reqFTP.Method?=?WebRequestMethods.Ftp.UploadFile;?

????
//?指定數(shù)據(jù)傳輸類型
????reqFTP.UseBinary?=?true;?

????
//?上傳文件時(shí)通知服務(wù)器文件的大小
????reqFTP.ContentLength?=?fileInf.Length;?

????
//?緩沖大小設(shè)置為2kb
????int?buffLength?=?2048;

????
byte[]?buff?=?new?byte[buffLength];
????
int?contentLen;?

????
//?打開一個(gè)文件流?(System.IO.FileStream)?去讀上傳的文件
????FileStream?fs?=?fileInf.OpenRead();?
????
try
????{
????????
//?把上傳的文件寫入流
????????Stream?strm?=?reqFTP.GetRequestStream();?

????????
//?每次讀文件流的2kb
????????contentLen?=?fs.Read(buff,?0,?buffLength);?

????????
//?流內(nèi)容沒有結(jié)束
????????while?(contentLen?!=?0)
????????{
????????????
//?把內(nèi)容從file?stream?寫入?upload?stream
????????????strm.Write(buff,?0,?contentLen);

????????????contentLen?
=?fs.Read(buff,?0,?buffLength);
????????}?

????????
//?關(guān)閉兩個(gè)流
????????strm.Close();
????????fs.Close();
????}
????
catch?(Exception?ex)
????{
????????MessageBox.Show(ex.Message,?
"Upload?Error");
????}
}

以上代碼簡(jiǎn)單的示例了ftp的上傳功能。創(chuàng)建一個(gè)指向某ftp服務(wù)器的FtpWebRequest對(duì)象,然后設(shè)置其不同的屬性Credentials,KeepAlive,Method,UseBinary,ContentLength。

打開本地機(jī)器上的文件,把其內(nèi)容寫入ftp請(qǐng)求流。緩沖的大小為2kb,無(wú)論上傳大文件還是小文件,這都是一個(gè)合適的大小。
private?void?Download(string?filePath,?string?fileName)
{
????FtpWebRequest?reqFTP;

????
try
????{
????????FileStream?outputStream?
=?new?FileStream(filePath?+?"\\"?+?fileName,?FileMode.Create);?

????????reqFTP?
=?(FtpWebRequest)FtpWebRequest.Create(new?Uri("ftp://"?+?ftpServerIP?+??t;?+?fileName));

????????reqFTP.Method?
=?WebRequestMethods.Ftp.DownloadFile;

????????reqFTP.UseBinary?
=?true;

????????reqFTP.Credentials?
=?new?NetworkCredential(ftpUserID,?ftpPassword);

????????FtpWebResponse?response?
=?(FtpWebResponse)reqFTP.GetResponse();

????????Stream?ftpStream?
=?response.GetResponseStream();

????????
long?cl?=?response.ContentLength;

????????
int?bufferSize?=?2048;

????????
int?readCount;

????????
byte[]?buffer?=?new?byte[bufferSize];

????????readCount?
=?ftpStream.Read(buffer,?0,?bufferSize);

????????
while?(readCount?>?0)
????????{
????????????outputStream.Write(buffer,?
0,?readCount);

????????????readCount?
=?ftpStream.Read(buffer,?0,?bufferSize);
????????}

????????ftpStream.Close();

????????outputStream.Close();

????????response.Close();
????}
????
catch?(Exception?ex)
????{
????????MessageBox.Show(ex.Message);
????}
}
上面的代碼實(shí)現(xiàn)了從ftp服務(wù)器上下載文件的功能。這不同于之前所提到的上傳功能,下載需要一個(gè)響應(yīng)流,它包含著下載文件的內(nèi)容。這個(gè)下載的文件是在FtpWebRequest對(duì)象中的uri指定的。在得到所請(qǐng)求的文件后,通過FtpWebRequest對(duì)象的GetResponse()方法下載文件。它將把文件作為一個(gè)流下載到你的客戶端的機(jī)器上。

注意:我們可以設(shè)置文件在我們本地機(jī)器上的存放路徑和名稱。
public?string[]?GetFileList()
{????
????
string[]?downloadFiles;????
????StringBuilder?result?
=?new?StringBuilder();????
????FtpWebRequest?reqFTP;????
????
try????
????{????????
????????reqFTP?
=?(FtpWebRequest)FtpWebRequest.Create(new?Uri("ftp://"?+?ftpServerIP?+?"/??bsp;?????
????????reqFTP.UseBinary?=?true;????????
????????reqFTP.Credentials?
=?new?NetworkCredential(ftpUserID,?ftpPassword);????????
????????reqFTP.Method?
=?WebRequestMethods.Ftp.ListDirectory;????????
????????WebResponse?response?
=?reqFTP.GetResponse();????????
????????StreamReader?reader?
=?new?StreamReader(response.GetResponseStream());????????
????????
string?line?=?reader.ReadLine();????????
????????
while?(line?!=?null)????????
????????{????????????
????????????result.Append(line);????????????
????????????result.Append(
"\n");????????????
????????????line?
=?reader.ReadLine();????????
????????}????????
????????
//?to?remove?the?trailing?'\n'????????
????????result.Remove(result.ToString().LastIndexOf('\n'),?1);????????
????????reader.Close();????????
????????response.Close();????????
????????
return?result.ToString().Split('\n');????
????}????
????
catch?(Exception?ex)????
????{????????
????????System.Windows.Forms.MessageBox.Show(ex.Message);????????
????????downloadFiles?
=?null;????????
????????
return?downloadFiles;????
????}
}

上面的代碼示例了如何從ftp服務(wù)器上獲得文件列表。uri指向ftp服務(wù)器的地址。我們使用StreamReader對(duì)象來(lái)存儲(chǔ)一個(gè)流,文件名稱列表通過“\r\n”分隔開,也就是說每一個(gè)文件名稱都占一行。你可以使用StreamReader對(duì)象的ReadToEnd()方法來(lái)得到文件列表。上面的代碼中我們用一個(gè)StringBuilder對(duì)象來(lái)保存文件名稱,然后把結(jié)果通過分隔符分開后作為一個(gè)數(shù)組返回。我確定只是一個(gè)比較好的方法。

其他的實(shí)現(xiàn)如Rename,Delete,GetFileSize,FileListDetails,MakeDir等與上面的幾段代碼類似,就不多說了。

注意:實(shí)現(xiàn)重命名的功能時(shí),要把新的名字設(shè)置給FtpWebRequest對(duì)象的RenameTo屬性。連接指定目錄的時(shí)候,需要在FtpWebRequest對(duì)象所使用的uri中指明。


需要注意的地方
你在編碼時(shí)需要注意以下幾點(diǎn):
????·除非EnableSsl屬性被設(shè)置成true,否作所有數(shù)據(jù),包括你的用戶名和密碼都將明文發(fā)給服務(wù)器,任何監(jiān)視網(wǎng)絡(luò)的人都可以獲取到你連接服務(wù)器的驗(yàn)證信息。如果你連接的ftp服務(wù)器提供了SSL,你就應(yīng)當(dāng)把EnableSsl屬性設(shè)置為true。
????·如果你沒有訪問ftp服務(wù)器的權(quán)限,將會(huì)拋出SecurityException錯(cuò)誤
????·發(fā)送請(qǐng)求到ftp服務(wù)器需要調(diào)用GetResponse方法。當(dāng)請(qǐng)求的操作完成后,一個(gè)FtpWebResponse對(duì)象將返回。這個(gè)FtpWebResponse對(duì)象提供了操作的狀態(tài)和已經(jīng)從ftp服務(wù)器上下載的數(shù)據(jù)。FtpWebResponse對(duì)象的StatusCode屬性提供了ftp服務(wù)器返回的最后的狀態(tài)代碼。FtpWebResponse對(duì)象的StatusDescription屬性為這個(gè)狀態(tài)代碼的描述。
毛毛的小窩

轉(zhuǎn)載于:https://www.cnblogs.com/mjgforever/archive/2007/05/14/745667.html

總結(jié)

以上是生活随笔為你收集整理的简单的FTP应用程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。