C#中FTP常用操作的示例代碼
C# FTP常用操作
直接上代碼。以后有空在解釋一下
public class FtpState { private ManualResetEvent wait; private FtpWebRequest request; private string fileName; private Exception operationException = null; string status; public FtpState() { wait = new ManualResetEvent(false); } public ManualResetEvent OperationComplete { get { return wait; } } public FtpWebRequest Request { get { return request; } set { request = value; } } public string FileName { get { return fileName; } set { fileName = value; } } public Exception OperationException { get { return operationException; } set { operationException = value; } } public string StatusDescription { get { return status; } set { status = value; } } } //包含了對FTP常用的方法 public class FtpClient { #region 構(gòu)造函數(shù) /// <summary> /// 創(chuàng)建FTP工具 /// <para> /// 默認(rèn)不使用SSL,使用二進(jìn)制傳輸方式,使用被動(dòng)模式FTP有兩種使用模式:主動(dòng)和被動(dòng)。 /// 主動(dòng)模式要求客戶端和服務(wù)器端同時(shí)打開并且監(jiān)聽一個(gè)端口以建立連接。 /// 在這種情況下,客戶端由于安裝了防火墻會(huì)產(chǎn)生一些問題。 /// 所以,創(chuàng)立了被動(dòng)模式。 /// 被動(dòng)模式只要求服務(wù)器端產(chǎn)生一個(gè)監(jiān)聽相應(yīng)端口的進(jìn)程,這樣就可以繞過客戶端安裝了防火墻的問題。 /// </para> /// </summary> /// <param name="host">主機(jī)名稱</param> /// <param name="userId">用戶名</param> /// <param name="password">密碼</param> public FtpClient(string host, string userId, string password) : this(host, userId, password, 8022, null, false, true, true) { } /// <summary> /// 創(chuàng)建FTP工具 /// </summary> /// <param name="host">主機(jī)名稱</param> /// <param name="userId">用戶名</param> /// <param name="password">密碼</param> /// <param name="port">端口</param> /// <param name="enableSsl">允許Ssl</param> /// <param name="proxy">代理</param> /// <param name="useBinary">允許二進(jìn)制</param> /// <param name="usePassive">允許被動(dòng)模式</param> public FtpClient(string host, string userId, string password, int port, IWebProxy proxy, bool enableSsl, bool useBinary, bool usePassive) { this.userId = userId; this.password = password; MESOperate Dal = new MESOperate(); DataTable dt = Dal.GetServer(); string IP = ""; foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList) { if (_IPAddress.AddressFamily.ToString() == "InterNetwork") { IP = _IPAddress.ToString(); } } if (IP.Substring(0, 6) == "172.30") { this.host = "ftp://" +dt.Rows[0]["SERVER_IP_NEW"].ToString();//產(chǎn)線 } else { this.host = "ftp://" + dt.Rows[0]["SERVER_IP"].ToString();//OA } this.port = port; this.proxy = proxy; this.enableSsl = enableSsl; this.useBinary = useBinary; this.usePassive = usePassive; this.wait = new ManualResetEvent(false); } #endregion #region 變量 #region 主機(jī) private string host = string.Empty; /// <summary> /// 主機(jī) /// </summary> public string Host { get { return this.host ?? string.Empty;//如果左操作數(shù)為空則返回右操作數(shù),不為空返回左操作數(shù) } } #endregion #region 登錄用戶名 private string userId = string.Empty; /// <summary> /// 登錄用戶名 /// </summary> public string UserId { get { return this.userId; } } #endregion #region 密碼 private string password = string.Empty; /// <summary> /// 密碼 /// </summary> public string Password { get { return this.password; } } #endregion #region 代理 IWebProxy proxy = null; /// <summary> /// 代理 /// </summary> public IWebProxy Proxy { get { return this.proxy; } set { this.proxy = value; } } #endregion #region 端口 private int port = 8022; /// <summary> /// 端口 /// </summary> public int Port { get { return port; } set { this.port = value; } } #endregion #region 設(shè)置是否允許Ssl private bool enableSsl = false; /// <summary> /// EnableSsl /// </summary> public bool EnableSsl { get { return enableSsl; } } #endregion #region 使用被動(dòng)模式 private bool usePassive = true; /// <summary> /// 被動(dòng)模式 /// </summary> public bool UsePassive { get { return usePassive; } set { this.usePassive = value; } } #endregion #region 二進(jìn)制方式 private bool useBinary = true; /// <summary> /// 二進(jìn)制方式 /// </summary> public bool UseBinary { get { return useBinary; } set { this.useBinary = value; } } #endregion #region 遠(yuǎn)端路徑 private string remotePath = "/"; /// <summary> /// 遠(yuǎn)端路徑 /// <para> /// 返回FTP服務(wù)器上的當(dāng)前路徑(可以是 / 或 /a/../ 的形式) /// </para> /// </summary> public string RemotePath { get { return remotePath; } set { string result = "/"; if (!string.IsNullOrEmpty(value) && value != "/") { result = "/" + value.TrimStart('/').TrimEnd('/') + "/"; } this.remotePath = result; } } #endregion private ManualResetEvent wait; public ManualResetEvent OperationComplete { get { return wait; } } #endregion #region 創(chuàng)建一個(gè)FTP連接 /// <summary> /// 創(chuàng)建一個(gè)FTP請求 /// </summary> /// <param name="url">請求地址</param> /// <param name="method">請求方法</param> /// <returns>FTP請求</returns> private FtpWebRequest CreateRequest(string url, string method) { //建立連接 FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri(url)); request.Credentials = new NetworkCredential(this.userId, this.password); request.Proxy = this.proxy; request.KeepAlive = false;//命令執(zhí)行完畢之后關(guān)閉連接 request.UseBinary = useBinary; request.UsePassive = usePassive; request.EnableSsl = enableSsl; request.Method = method; return request; } #endregion #region 異步上傳 /// <summary> /// 把文件上傳到FTP服務(wù)器的RemotePath下 /// </summary> /// <param name="localFile">本地文件信息</param> /// <param name="remoteFileName">要保存到FTP文件服務(wù)器上的文件名稱包含擴(kuò)展名</param> /// <param name="isReName">是否重命名</param> /// <returns></returns> public bool UploadAsync(string localFile, string remoteFileName,bool isReName,string newName) { ManualResetEvent waitObject; FtpState state = new FtpState(); if (File.Exists(localFile)) { string url = Host.TrimEnd('/') + RemotePath + remoteFileName; FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.UploadFile); state.Request = request; state.FileName = localFile; // Get the event to wait on. waitObject = state.OperationComplete; request.BeginGetRequestStream( new AsyncCallback(EndGetStreamCallback), state ); waitObject.WaitOne(); // The operations either completed or threw an exception. if (state.OperationException != null) { throw state.OperationException; } if (isReName) { if (this.CheckFileExist(remoteFileName)) { if (this.Rename(remoteFileName, newName)) { return true; } } else { throw new Exception(string.Format("遠(yuǎn)端文件不存在,{0}", remoteFileName)); } } else { return true; } return false; } throw new Exception(string.Format("本地文件不存在,文件路徑:{0}", localFile)); } private void EndGetStreamCallback(IAsyncResult ar) { FtpState state = (FtpState)ar.AsyncState; Stream requestStream = null; // End the asynchronous call to get the request stream. try { requestStream = state.Request.EndGetRequestStream(ar); // Copy the file contents to the request stream. const int bufferLength = 2048; byte[] buffer = new byte[bufferLength]; int count = 0; int readBytes = 0; FileStream stream = File.OpenRead(state.FileName); do { readBytes = stream.Read(buffer, 0, bufferLength); requestStream.Write(buffer, 0, readBytes); count += readBytes; } while (readBytes != 0); //Console.WriteLine("Writing {0} bytes to the stream.", count); // IMPORTANT: Close the request stream before sending the request. requestStream.Close(); // Asynchronously get the response to the upload request. state.Request.BeginGetResponse( new AsyncCallback(EndGetResponseCallback), state ); } // Return exceptions to the main application thread. catch (Exception e) { state.OperationException = e; state.OperationComplete.Set(); //throw new Exception("Could not get the request stream."); } } private void EndGetResponseCallback(IAsyncResult ar) { FtpState state = (FtpState)ar.AsyncState; FtpWebResponse response = null; try { response = (FtpWebResponse)state.Request.EndGetResponse(ar); response.Close(); state.StatusDescription = response.StatusDescription; // Signal the main application thread that // the operation is complete. state.OperationComplete.Set(); } // Return exceptions to the main application thread. catch (Exception e) { state.OperationException = e; state.OperationComplete.Set(); //throw new Exception("Error getting response."); } } #endregion #region 上傳一個(gè)文件到遠(yuǎn)端路徑下 /// <summary> /// 把文件上傳到FTP服務(wù)器的RemotePath下 /// </summary> /// <param name="localFile">本地文件信息</param> /// <param name="remoteFileName">要保存到FTP文件服務(wù)器上的文件名稱包含擴(kuò)展名</param> public bool Upload(FileInfo localFile, string remoteFileName) { bool result = false; if (localFile.Exists) { string url = Host.TrimEnd('/') + RemotePath + remoteFileName; FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.UploadFile); //上傳數(shù)據(jù) using (Stream rs = request.GetRequestStream()) { using (FileStream fs = localFile.OpenRead()) { byte[] buffer = new byte[4096];//4K int count = fs.Read(buffer, 0, buffer.Length);//每次從流中讀4個(gè)字節(jié)再寫入緩沖區(qū) while (count > 0) { rs.Write(buffer, 0, count); count = fs.Read(buffer, 0, buffer.Length); } fs.Close(); result = true; } } return result; } throw new Exception(string.Format("本地文件不存在,文件路徑:{0}", localFile.FullName)); } #endregion #region 從FTP服務(wù)器上下載文件 /// <summary> /// 從當(dāng)前目錄下下載文件 /// <para> /// 如果本地文件存在,則從本地文件結(jié)束的位置開始下載. /// </para> /// </summary> /// <param name="serverName">服務(wù)器上的文件名稱</param> /// <param name="localName">本地文件名稱</param> /// <returns>返回一個(gè)值,指示是否下載成功</returns> public bool Download(string serverName, string localName) { try { bool result = false; //string tempfilename = Path.GetDirectoryName(localName) + @"\" + Path.GetFileNameWithoutExtension(localName) + ".tmp"; if (File.Exists(localName)) return true; using (FileStream fs = new FileStream(localName, FileMode.OpenOrCreate)) //創(chuàng)建或打開本地文件 { //建立連接 string url = Host.TrimEnd('/') + RemotePath + serverName; FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.DownloadFile); request.ContentOffset = fs.Length; using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) { fs.Position = fs.Length; byte[] buffer = new byte[4096];//4K int count = response.GetResponseStream().Read(buffer, 0, buffer.Length); while (count > 0) { fs.Write(buffer, 0, count); count = response.GetResponseStream().Read(buffer, 0, buffer.Length); } response.GetResponseStream().Close(); } result = true; } return result; } catch (Exception ex) { throw ex; } } #endregion #region 重命名FTP服務(wù)器上的文件 /// <summary> /// 文件更名 /// </summary> /// <param name="oldFileName">原文件名</param> /// <param name="newFileName">新文件名</param> /// <returns>返回一個(gè)值,指示更名是否成功</returns> public bool Rename(string oldFileName, string newFileName) { bool result = false; //建立連接 string url = Host.TrimEnd('/') + RemotePath + oldFileName; FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.Rename); request.RenameTo = newFileName; using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) { result = true; } return result; } #endregion #region 從當(dāng)前目錄下獲取文件列表 /// <summary> /// 獲取當(dāng)前目錄下文件列表 /// </summary> /// <returns></returns> public List<string> GetFileList() { try { List<string> result = new List<string>(); //建立連接 string url = Host.TrimEnd('/') + RemotePath; FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.ListDirectory); using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) { StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.Default);//中文文件名 string line = reader.ReadLine(); while (line != null) { result.Add(line); line = reader.ReadLine(); } } return result; } catch (Exception ex) { throw ex; } } #endregion #region 從FTP服務(wù)器上獲取文件和文件夾列表 /// <summary> /// 獲取詳細(xì)列表 /// </summary> /// <returns></returns> public List<string> GetFileDetails() { List<string> result = new List<string>(); //建立連接 string url = Host.TrimEnd('/') + RemotePath; FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.ListDirectoryDetails); using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) { StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.Default);//中文文件名 string line = reader.ReadLine(); while (line != null) { result.Add(line); line = reader.ReadLine(); } } return result; } public List<string> GetFileDetails(string remotepath) { List<string> result = new List<string>(); //建立連接 string url = Host.TrimEnd('/') + remotepath; FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.ListDirectoryDetails); using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) { StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.Default);//中文文件名 string line = reader.ReadLine(); while (line != null) { result.Add(line); line = reader.ReadLine(); } } return result; } #endregion #region 從FTP服務(wù)器上刪除文件 /// <summary> /// 刪除FTP服務(wù)器上的文件 /// </summary> /// <param name="fileName">文件名稱</param> /// <returns>返回一個(gè)值,指示是否刪除成功</returns> public bool DeleteFile(string fileName) { bool result = false; //建立連接 string url = Host.TrimEnd('/') + RemotePath + fileName; FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.DeleteFile); using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) { result = true; } return result; } #endregion #region 在FTP服務(wù)器上創(chuàng)建目錄 /// <summary> /// 在當(dāng)前目錄下創(chuàng)建文件夾 /// </summary> /// <param name="dirName">文件夾名稱</param> /// <returns>返回一個(gè)值,指示是否創(chuàng)建成功</returns> public bool MakeDirectory(string dirName) { bool result = false; //建立連接 string url = Host.TrimEnd('/') + RemotePath + dirName; FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.MakeDirectory); using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) { result = true; } return result; } #endregion #region 從FTP服務(wù)器上刪除目錄 /// <summary> /// 刪除文件夾 /// </summary> /// <param name="dirName">文件夾名稱</param> /// <returns>返回一個(gè)值,指示是否刪除成功</returns> public bool DeleteDirectory(string dirName) { bool result = false; //建立連接 string url = Host.TrimEnd('/') + RemotePath + dirName; FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.RemoveDirectory); using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) { result = true; } return result; } #endregion #region 從FTP服務(wù)器上獲取文件大小 /// <summary> /// 獲取文件大小 /// </summary> /// <param name="fileName"></param> /// <returns></returns> public long GetFileSize(string fileName) { long result = 0; //建立連接 string url = Host.TrimEnd('/') + RemotePath + fileName; FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.GetFileSize); using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) { result = response.ContentLength; } return result; } #endregion #region 給FTP服務(wù)器上的文件追加內(nèi)容 /// <summary> /// 給FTP服務(wù)器上的文件追加內(nèi)容 /// </summary> /// <param name="localFile">本地文件</param> /// <param name="remoteFileName">FTP服務(wù)器上的文件</param> /// <returns>返回一個(gè)值,指示是否追加成功</returns> public bool Append(FileInfo localFile, string remoteFileName) { if (localFile.Exists) { using (FileStream fs = new FileStream(localFile.FullName, FileMode.Open)) { return Append(fs, remoteFileName); } } throw new Exception(string.Format("本地文件不存在,文件路徑:{0}", localFile.FullName)); } /// <summary> /// 給FTP服務(wù)器上的文件追加內(nèi)容 /// </summary> /// <param name="stream">數(shù)據(jù)流(可通過設(shè)置偏移來實(shí)現(xiàn)從特定位置開始上傳)</param> /// <param name="remoteFileName">FTP服務(wù)器上的文件</param> /// <returns>返回一個(gè)值,指示是否追加成功</returns> public bool Append(Stream stream, string remoteFileName) { bool result = false; if (stream != null && stream.CanRead) { //建立連接 string url = Host.TrimEnd('/') + RemotePath + remoteFileName; FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.AppendFile); using (Stream rs = request.GetRequestStream()) { //上傳數(shù)據(jù) byte[] buffer = new byte[4096];//4K int count = stream.Read(buffer, 0, buffer.Length); while (count > 0) { rs.Write(buffer, 0, count); count = stream.Read(buffer, 0, buffer.Length); } result = true; } } return result; } #endregion #region 獲取FTP服務(wù)器上的當(dāng)前路徑 /// <summary> /// 獲取FTP服務(wù)器上的當(dāng)前路徑 /// </summary> public string CurrentDirectory { get { string result = string.Empty; string url = Host.TrimEnd('/') + RemotePath; FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.PrintWorkingDirectory); using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) { string temp = response.StatusDescription; int start = temp.IndexOf('"') + 1; int end = temp.LastIndexOf('"'); if (end >= start) { result = temp.Substring(start, end - start); } } return result; } } #endregion #region 檢查當(dāng)前路徑上是否存在某個(gè)文件 /// <summary> /// 檢查文件是否存在 /// </summary> /// <param name="fileName">要檢查的文件名</param> /// <returns>返回一個(gè)值,指示要檢查的文件是否存在</returns> public bool CheckFileExist(string fileName) { bool result = false; if (fileName != null && fileName.Trim().Length > 0) { fileName = fileName.Trim(); List<string> files = GetFileList(); if (files != null && files.Count > 0) { if (files.Count(q => q.ToLower() == fileName.ToLower()) > 0) result = true; } } return result; } #endregion /// <summary> /// 判斷當(dāng)前目錄下指定的子目錄是否存在 /// </summary> /// <param name="RemoteDirectoryName">指定的目錄名</param> public bool CheckDirectoryExist(string rootDir, string RemoteDirectoryName) { string[] dirList = GetDirectoryList(rootDir);//獲取子目錄 if (dirList.Length > 0) { foreach (string str in dirList) { if (str.Trim() == RemoteDirectoryName.Trim()) { return true; } } } return false; } //獲取子目錄 public string[] GetDirectoryList(string dirName) { string[] drectory = GetFileDetails(dirName).ToArray(); List<string> strList = new List<string>(); if (drectory.Length > 0) { foreach (string str in drectory) { if (str.Trim().Length == 0) continue; //會(huì)有兩種格式的詳細(xì)信息返回 //一種包含<DIR> //一種第一個(gè)字符串是drwxerwxx這樣的權(quán)限操作符號 //現(xiàn)在寫代碼包容兩種格式的字符串 if (str.Trim().Contains("<DIR>")) { strList.Add(str.Substring(39).Trim()); } else { if (str.Trim().Substring(0, 1).ToUpper() == "D") { strList.Add(str.Substring(55).Trim()); } } } } return strList.ToArray(); } }
到此這篇關(guān)于C#中FTP常用操作的示例代碼的文章就介紹到這了,更多相關(guān)C# FTP操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#如何在窗體程序中操作數(shù)據(jù)庫數(shù)據(jù)
這篇文章主要介紹了C#如何在窗體程序中操作數(shù)據(jù)庫數(shù)據(jù),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04c# 實(shí)現(xiàn)MD5,SHA1,SHA256,SHA512等常用加密算法源代碼
c# 如何實(shí)現(xiàn)MD5,SHA1,SHA256,SHA512等常用加密算法,需要的朋友可以參考下2012-12-12Unity實(shí)現(xiàn)動(dòng)物識(shí)別的示例代碼
本文主要介紹了如何通過Unity實(shí)現(xiàn)動(dòng)物識(shí)別,可以實(shí)現(xiàn)識(shí)別近八千種動(dòng)物,接口返回動(dòng)物名稱,并可獲取識(shí)別結(jié)果對應(yīng)的百科信息,感興趣的可以了解一下2022-02-02C#如何在WinForm中打開Excel文件,或打開Excel應(yīng)用顯示數(shù)據(jù)
這篇文章詳細(xì)介紹了如何在WinForm中打開Excel文件,并提供了相關(guān)的代碼解釋、數(shù)據(jù)插入、單元格格式設(shè)置和頁面格式設(shè)置的方法2024-12-12C#實(shí)現(xiàn)文件與二進(jìn)制互轉(zhuǎn)并存入數(shù)據(jù)庫
這篇文章主要介紹了C#實(shí)現(xiàn)文件與二進(jìn)制互轉(zhuǎn)并存入數(shù)據(jù)庫,本文直接給出代碼實(shí)例,代碼中包含詳細(xì)注釋,需要的朋友可以參考下2015-06-06C# 并發(fā)控制框架之單線程環(huán)境下實(shí)現(xiàn)每秒百萬級調(diào)度
本文介紹了一款專為工業(yè)自動(dòng)化及機(jī)器視覺開發(fā)的C#并發(fā)流程控制框架,通過模仿Go語言并發(fā)模式設(shè)計(jì),支持高頻調(diào)度及復(fù)雜任務(wù)處理,已在多個(gè)項(xiàng)目中驗(yàn)證其穩(wěn)定性和可靠性2024-10-10C# 微信支付 wx.chooseWXPay 簽名錯(cuò)誤的解決方法
本篇文章主要介紹了C# 微信支付 wx.chooseWXPay 簽名錯(cuò)誤的解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12C#設(shè)計(jì)模式之Template模板方法模式實(shí)現(xiàn)ASP.NET自定義控件 密碼強(qiáng)度檢測功能
這篇文章主要介紹了C#設(shè)計(jì)模式之Template模板方法模式實(shí)現(xiàn)ASP.NET自定義控件 密碼強(qiáng)度檢測功能,簡單介紹了模板方法模式的定義、原理及檢測密碼強(qiáng)度的相關(guān)使用技巧,需要的朋友可以參考下2017-09-09