using System; using System.Collections.Generic; using System.Text; using System.Net; using System.IO; namespace ConsoleApplication1 { public class Ftp { string ftpServerIP; string ftpUserID; string ftpPassword; /// <summary> /// 主動模式是當進行文件下載時遠程主機連接到本地主機的某端口進行數據發送,適用於本機網絡端口開放較多。 /// 被動模式是當進行文件下載時本機主機連接到遠程主機的某端口進行數據發送,適用於對端網絡端口開放較多。 /// </summary> bool usePassive = false; FtpWebRequest reqFTP; /// <summary> /// ftp登錄信息 /// </summary> /// <param name="ftpServerIP">ftpServerIP(例:221.1.217.92)</param> /// <param name="ftpUserID">ftpUserID</param> /// <param name="ftpPassword">ftpPassword</param> public Ftp(string ftpServerIP, string ftpUserID, string ftpPassword) { this.ftpServerIP = ftpServerIP; this.ftpUserID = ftpUserID; this.ftpPassword = ftpPassword; } public Ftp(string ftpServerIP, string ftpUserID, string ftpPassword, bool usePassive) { this.ftpServerIP = ftpServerIP; this.ftpUserID = ftpUserID; this.ftpPassword = ftpPassword; this.usePassive = usePassive; } #region 連接 /// <summary> /// 連接 /// </summary> /// <param name="path"></param> private void Connect(String path)//連接ftp { // 根據uri創建FtpWebRequest對象 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(path)); // 指定數據傳輸類型 reqFTP.UseBinary = true; reqFTP.UsePassive = usePassive; // ftp用戶名和密碼 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); } #endregion #region 獲取文件列表 /// <summary> /// 獲取文件列表 /// </summary> /// <param name="path"></param> /// <param name="WRMethods"></param> /// <param name="ResponseEncoding">編碼方式</param> /// <returns></returns> private string[] GetFileList(string path, string WRMethods, System.Text.Encoding ResponseEncoding)//上面的代碼示例了如何從ftp服務器上獲得文件列表 { string[] downloadFiles; StringBuilder result = new StringBuilder(); try { Connect(path); reqFTP.Method = WRMethods; WebResponse response = reqFTP.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream(), ResponseEncoding);//中文文件名 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) { downloadFiles = null; return downloadFiles; } } public string[] GetFileList(string path, System.Text.Encoding ResponseEncoding) { if (path.Contains("ftp") == false) { return GetFileList("ftp://" + ftpServerIP + "/" + path, WebRequestMethods.Ftp.ListDirectory, ResponseEncoding); } else { return GetFileList(path, WebRequestMethods.Ftp.ListDirectory, ResponseEncoding); } } public string[] GetFileList(string path) { return GetFileList("ftp://" + ftpServerIP + "/" + path, System.Text.Encoding.GetEncoding("UTF-8")); } public string[] GetFileList()//上面的代碼示例了如何從ftp服務器上獲得文件列表 { return GetFileList(""); } #endregion #region 上傳文件 /// <summary> /// 上傳文件 /// </summary> /// <param name="filename">本地文件名</param> /// <param name="path">ftp路徑</param> /// <param name="errorinfo"></param> public bool Upload(string filename, string path, out string errorinfo) //上面的代碼實現了從ftp服務器上載文件的功能 { path = path.Replace("\\", "/"); FileInfo fileInf = new FileInfo(filename); string uri = "ftp://" + path + "/" + fileInf.Name; DeleteFileName(fileInf.Name); Connect(uri);//連接 // 默認為true,連接不會被關閉 // 在一個命令之后被執行 reqFTP.KeepAlive = false; // 指定執行什么命令 reqFTP.Method = WebRequestMethods.Ftp.UploadFile; // 上傳文件時通知服務器文件的大小 reqFTP.ContentLength = fileInf.Length; // 緩沖大小設置為kb int buffLength = 2048; byte[] buff = new byte[buffLength]; int contentLen; // 打開一個文件流(System.IO.FileStream) 去讀上傳的文件 FileStream fs = fileInf.OpenRead(); try { // 把上傳的文件寫入流 Stream strm = reqFTP.GetRequestStream(); // 每次讀文件流的kb contentLen = fs.Read(buff, 0, buffLength); // 流內容沒有結束 while (contentLen != 0) { // 把內容從file stream 寫入upload stream strm.Write(buff, 0, contentLen); contentLen = fs.Read(buff, 0, buffLength); } // 關閉兩個流 strm.Close(); fs.Close(); errorinfo = "完成"; return true; } catch (Exception ex) { errorinfo = string.Format("因{0},無法完成上傳", ex.Message); return false; } } #endregion #region 續傳文件 /// <summary> /// 續傳文件 /// </summary> /// <param name="filename"></param> public bool Upload(string filename, long size, string path, out string errorinfo) //上面的代碼實現了從ftp服務器上載文件的功能 { path = path.Replace("\\", "/"); FileInfo fileInf = new FileInfo(filename); //string uri = "ftp://" + path + "/" + fileInf.Name; string uri = "ftp://" + path; Connect(uri);//連接 // 默認為true,連接不會被關閉 // 在一個命令之后被執行 reqFTP.KeepAlive = false; // 指定執行什么命令 reqFTP.Method = WebRequestMethods.Ftp.AppendFile; // 上傳文件時通知服務器文件的大小 reqFTP.ContentLength = fileInf.Length; // 緩沖大小設置為kb int buffLength = 2048; byte[] buff = new byte[buffLength]; int contentLen; // 打開一個文件流(System.IO.FileStream) 去讀上傳的文件 FileStream fs = fileInf.OpenRead(); try { StreamReader dsad = new StreamReader(fs); fs.Seek(size, SeekOrigin.Begin); // 把上傳的文件寫入流 Stream strm = reqFTP.GetRequestStream(); // 每次讀文件流的kb contentLen = fs.Read(buff, 0, buffLength); // 流內容沒有結束 while (contentLen != 0) { // 把內容從file stream 寫入upload stream strm.Write(buff, 0, contentLen); contentLen = fs.Read(buff, 0, buffLength); } // 關閉兩個流 strm.Close(); fs.Close(); errorinfo = "完成"; return true; } catch (Exception ex) { errorinfo = string.Format("因{0},無法完成上傳", ex.Message); return false; } } #endregion #region 下載文件 /// <summary> /// 下載文件 /// </summary> /// <param name="ftpfilepath">Ftp文件路徑:例:"221.1.217.92/20100510.txt"</param> /// <param name="filePath">本地目錄"c:\"</param> /// <param name="fileName">本地文件"1.txt"</param> /// <param name="errorinfo"></param> /// <returns></returns> public bool Download(string ftpfilepath, string LocalFilePath, string LocalFileName, out string errorinfo)////上面的代碼實現了從ftp服務器下載文件的功能 { try { LocalFilePath = LocalFilePath.Replace("我的電腦\\", ""); String onlyFileName = Path.GetFileName(LocalFileName); string newFileName = LocalFilePath + onlyFileName; if (File.Exists(newFileName)) { errorinfo = string.Format("本地文件{0}已存在,無法下載", newFileName); return false; } ftpfilepath = ftpfilepath.Replace("\\", "/"); string url = "ftp://" + ftpfilepath; Connect(url);//連接 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); FileStream outputStream = new FileStream(newFileName, FileMode.Create); while (readCount > 0) { outputStream.Write(buffer, 0, readCount); readCount = ftpStream.Read(buffer, 0, bufferSize); } ftpStream.Close(); outputStream.Close(); response.Close(); errorinfo = ""; return true; } catch (Exception ex) { errorinfo = string.Format("因{0},無法下載", ex.Message); return false; } } #endregion #region 刪除文件 /// <summary> /// 刪除文件 /// </summary> /// <param name="fileName"></param> public void DeleteFileName(string fileName) { try { FileInfo fileInf = new FileInfo(fileName); string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name; Connect(uri);//連接 // 默認為true,連接不會被關閉 // 在一個命令之后被執行 reqFTP.KeepAlive = false; // 指定執行什么命令 reqFTP.Method = WebRequestMethods.Ftp.DeleteFile; FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); response.Close(); } catch (Exception ex) { //MessageBox.Show(ex.Message, "刪除錯誤"); } } #endregion #region 在ftp上創建目錄 /// <summary> /// 在ftp上創建目錄 /// </summary> /// <param name="dirName"></param> public void MakeDir(string dirName) { try { string uri = "ftp://" + ftpServerIP + "/" + dirName; Connect(uri);//連接 reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory; FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); response.Close(); } catch (Exception ex) { // MessageBox.Show(ex.Message); } } #endregion #region 刪除ftp上目錄 /// <summary> /// 刪除ftp上目錄 /// </summary> /// <param name="dirName"></param> public void delDir(string dirName) { try { string uri = "ftp://" + ftpServerIP + "/" + dirName; Connect(uri);//連接 reqFTP.Method = WebRequestMethods.Ftp.RemoveDirectory; FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); response.Close(); } catch (Exception ex) { // MessageBox.Show(ex.Message); } } #endregion #region 獲得ftp上文件大小 /// <summary> /// 獲得ftp上文件大小 /// </summary> /// <param name="filename"></param> /// <returns></returns> public long GetFileSize(string filename) { long fileSize = 0; filename = filename.Replace("\\", "/"); try { // FileInfo fileInf = new FileInfo(filename); //string uri1 = "ftp://" + ftpServerIP + "/" + fileInf.Name; // string uri = filename; string uri = "ftp://" + filename; Connect(uri);//連接 reqFTP.Method = WebRequestMethods.Ftp.GetFileSize; FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); fileSize = response.ContentLength; response.Close(); } catch (Exception ex) { // MessageBox.Show(ex.Message); } return fileSize; } #endregion #region ftp上文件改名 /// <summary> /// ftp上文件改名 /// </summary> /// <param name="currentFilename"></param> /// <param name="newFilename"></param> public void Rename(string currentFilename, string newFilename) { try { FileInfo fileInf = new FileInfo(currentFilename); string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name; Connect(uri);//連接 reqFTP.Method = WebRequestMethods.Ftp.Rename; reqFTP.RenameTo = newFilename; FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); //Stream ftpStream = response.GetResponseStream(); //ftpStream.Close(); response.Close(); } catch (Exception ex) { // MessageBox.Show(ex.Message); } } #endregion } }