简单的FTP应用程序
生活随笔
收集整理的這篇文章主要介紹了
简单的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)代碼的描述。 毛毛的小窩
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 关于密码加密 (转载)
- 下一篇: EWORD 0513