using System; using System.Collections.Generic; using System.Text; using System.Net; using System.IO; using System.Windows.Forms; namespace ConvertData{ class FtpUpDown { string ftpServerIP; string ftpUserID; string ftpPassword; FtpWebRequest reqFTP; private void Connect(String path)//串連ftp { // 根據uri建立FtpWebRequest對象 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(path)); // 指定資料轉送類型 reqFTP.UseBinary = true; // ftp使用者名稱和密碼 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); } public FtpUpDown(string ftpServerIP, string ftpUserID, string ftpPassword) { this.ftpServerIP = ftpServerIP; this.ftpUserID = ftpUserID; this.ftpPassword = ftpPassword; } //都調用這個 private string[] GetFileList(string path, string WRMethods)//上面的程式碼範例了如何從ftp伺服器上獲得檔案清單 { string[] downloadFiles; StringBuilder result = new StringBuilder(); try { Connect(path); reqFTP.Method = WRMethods; WebResponse response = reqFTP.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.Default);//中文檔案名稱 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; } } public string[] GetFileList(string path)//上面的程式碼範例了如何從ftp伺服器上獲得檔案清單 { return GetFileList("ftp://" + ftpServerIP + "/" + path, WebRequestMethods.Ftp.ListDirectory); } public string[] GetFileList()//上面的程式碼範例了如何從ftp伺服器上獲得檔案清單 { return GetFileList("ftp://" + ftpServerIP + "/", WebRequestMethods.Ftp.ListDirectory); } public void Upload(string filename) //上面的代碼實現了從ftp伺服器上傳檔案的功能 { FileInfo fileInf = new FileInfo(filename); string uri = "ftp://" + ftpServerIP + "/" + 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(); } catch (Exception ex) { MessageBox.Show(ex.Message, "Upload Error"); } } public bool Download(string filePath, string fileName, out string errorinfo)////上面的代碼實現了從ftp伺服器下載檔案的功能 { try { String onlyFileName = Path.GetFileName(fileName); string newFileName = filePath + "\\" + onlyFileName; if (File.Exists(newFileName)) { errorinfo = string.Format("本地檔案{0}已存在,無法下載", newFileName); return false; } string url = "ftp://" + ftpServerIP + "/" + fileName; 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; } } //刪除檔案 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, "刪除錯誤"); } } //建立目錄 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); } } //刪除目錄 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); } } //獲得檔案大小 public long GetFileSize(string filename) { long fileSize = 0; try { FileInfo fileInf = new FileInfo(filename); string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name; 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; } //檔案改名 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); } } //獲得檔案明晰 public string[] GetFilesDetailList() { return GetFileList("ftp://" + ftpServerIP + "/", WebRequestMethods.Ftp.ListDirectoryDetails); } //獲得檔案明晰 public string[] GetFilesDetailList(string path) { return GetFileList("ftp://" + ftpServerIP + "/" + path, WebRequestMethods.Ftp.ListDirectoryDetails); } }}
上面為類,舉例證明如何代用
private void button1_Click(object sender, EventArgs e)//檔案上傳 { FtpUpDown ftpUpDown = new FtpUpDown("192.168.2.130:21", "wl","123456"); ftpUpDown.Upload("E:\\other.rar"); } private void button3_Click(object sender, EventArgs e)//修改 { FtpUpDown ftpUpDown = new FtpUpDown("192.168.2.130:21", "wl", "123456"); ftpUpDown.Rename("張三", "李四"); } private void button4_Click(object sender, EventArgs e)//刪除 { FtpUpDown ftpUpDown = new FtpUpDown("192.168.2.130:21", "wl", "123456"); ftpUpDown.delDir("張三"); } private void button2_Click(object sender, EventArgs e)//添加 { FtpUpDown ftpUpDown = new FtpUpDown("192.168.2.130:21", "wl", "123456"); ftpUpDown.MakeDir(this.TxT_name.Text); } //獲得ftp檔案的檔案明晰,還為處理,能夠獲得所有的檔案名稱 FtpUpDown ftpUpDown = new FtpUpDown("192.168.2.130", "wl", "123456"); string[] str = ftpUpDown.GetFilesDetailList(); int i = 1; foreach (string item in str) { string[] name = item.Split(' '); TxT_name.Text += name[name.Length - 1] + ";"; i++; } label1.Text = i.ToString();