C#開發(fā)教程之ftp操作方法整理
1.最近項目開發(fā)涉及到ftp操作。發(fā)現(xiàn)FtpWebRequest類有些操作很麻煩,
例如創(chuàng)建目錄只能創(chuàng)建一級目錄,多級就失敗。刪除目錄只能刪除最后一級的空目錄。同樣下載也是。
故寫下幫助類方便使用。
2.調(diào)用方法展示,
var ftp = new FtpHelper("111.111.111.111", "xxxxxxx", "xxxxxx");//初始化ftp,創(chuàng)建ftp對象 ftp.uploadFile("F:\\wms.zip","aaa//bbb");//參數(shù)1本地文件,參數(shù)2:ftp的目錄 ftp.delDirAll("aaa");//參數(shù) 要刪除的目錄的 路徑 ftp.downloadAllFile("aaa","F:\\myfile");//參數(shù)1:要下載的目錄,參數(shù)2,保存到本地的目錄
3.FtpHelper 代碼。后續(xù)再補(bǔ)充說明
1.異常方法委托,通過Lamda委托統(tǒng)一處理異常,方便改寫。加了個委托方便控制異常輸出
2.遞歸查找所有目錄存入list,然后根據(jù) level排序,從最末級開始遍歷刪除
3.ftp的目錄列表比較怪,暫時用截取字符串的獲取 目錄或文件
/// <summary> /// ftp幫助類 /// </summary> public class FtpHelper { private string ftpHostIP { get; set; } private string username { get; set; } private string password { get; set; } private string ftpURI { get { return $@"ftp://{ftpHostIP}/"; } } /// <summary> /// 初始化ftp參數(shù) /// </summary> /// <param name="ftpHostIP">ftp主機(jī)IP</param> /// <param name="username">ftp賬戶</param> /// <param name="password">ftp密碼</param> public FtpHelper(string ftpHostIP, string username, string password) { this.ftpHostIP = ftpHostIP; this.username = username; this.password = password; } /// <summary> /// 異常方法委托,通過Lamda委托統(tǒng)一處理異常,方便改寫 /// </summary> /// <param name="method">當(dāng)前執(zhí)行的方法</param> /// <param name="action"></param> /// <returns></returns> private bool MethodInvoke(string method, Action action) { if (action != null) { try { action(); //Logger.Write2File($@"FtpHelper.{method}:執(zhí)行成功"); FluentConsole.Red.Line($@"FtpHelper.{method}:執(zhí)行成功"); return true; } catch (Exception ex) { FluentConsole.Red.Line($@"FtpHelper.{method}:執(zhí)行失敗", ex.ToString()); // Logger.Write2File(action.GetType().Name, ex.ToString()); return false; } } else { return false; } } /// <summary> /// 異常方法委托,通過Lamda委托統(tǒng)一處理異常,方便改寫 /// </summary> /// </summary> /// <typeparam name="T"></typeparam> /// <param name="method"></param> /// <param name="func"></param> /// <returns></returns> private T MethodInvoke<T>(string method, Func<T> func) { if (func != null) { try { FluentConsole.Red.Line($@"FtpHelper.{method}:執(zhí)行成功"); return func(); //Logger.Write2File($@"FtpHelper.{method}:執(zhí)行成功"); } catch (Exception ex) { FluentConsole.Red.Line($@"FtpHelper.{method}:執(zhí)行失敗:{ex}"); // Logger.Write2File($@"FtpHelper.{method}:執(zhí)行失敗", ex.ToString()); return default(T); } } else { return default(T); } } private FtpWebRequest GetRequest(string URI) { //根據(jù)服務(wù)器信息FtpWebRequest創(chuàng)建類的對象 FtpWebRequest result = (FtpWebRequest)WebRequest.Create(URI); result.Credentials = new NetworkCredential(username, password); result.KeepAlive = false; result.UsePassive = false; result.UseBinary = true; return result; } /// <summary> 上傳文件</summary> /// <param name="filePath">需要上傳的文件</param> /// <param name="targetDir">目標(biāo)路徑</param> public bool uploadFile(string filePath, string dirName = "") { FileInfo fileInfo = new FileInfo(filePath); if (dirName != "") makeDir(dirName); string uri = Path.Combine(ftpURI, dirName, fileInfo.Name); return MethodInvoke($@"uploadFile({filePath},{dirName})", () => { FtpWebRequest ftp = GetRequest(uri); ftp.Method = WebRequestMethods.Ftp.UploadFile; ftp.ContentLength = fileInfo.Length; int buffLength = 2048; byte[] buff = new byte[buffLength]; int contentLen; using (FileStream fs = fileInfo.OpenRead()) { using (Stream strm = ftp.GetRequestStream()) { contentLen = fs.Read(buff, 0, buffLength); while (contentLen != 0) { strm.Write(buff, 0, contentLen); contentLen = fs.Read(buff, 0, buffLength); } strm.Close(); } fs.Close(); } }); } /// <summary> /// 檢查目錄是否存在 /// </summary> /// <param name="dirName"></param> /// <param name="currentDir"></param> /// <returns></returns> public bool checkDir(string dirName, string currentDir = "") { string uri = Path.Combine(ftpURI, currentDir); return MethodInvoke($@"checkDir({dirName}{currentDir})", () => { FtpWebRequest ftp = GetRequest(uri); ftp.UseBinary = true; ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails; Stream stream = ftp.GetResponse().GetResponseStream(); using (StreamReader sr = new StreamReader(stream)) { string line = sr.ReadLine(); while (!string.IsNullOrEmpty(line)) { string dir = string.Empty; if (line.IndexOf("<DIR>") > -1) { if (line.Substring(line.IndexOf("<DIR>") + 5).Trim() == dirName) return true; } line = sr.ReadLine(); } sr.Close(); } stream.Close(); return false; }); } /// <summary> /// 獲取當(dāng)前目錄下的目錄及文件 /// </summary> /// param name="ftpfileList"></param> /// <param name="dirName"></param> /// <returns></returns> public List<Ftpfile> getFtpFile(string dirName) { var ftpfileList = new List<Ftpfile>(); string uri = Path.Combine(ftpURI, dirName); return MethodInvoke($@"getFile({dirName})", () => { var a = new List<List<string>>(); FtpWebRequest ftp = GetRequest(uri); ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails; Stream stream = ftp.GetResponse().GetResponseStream(); using (StreamReader sr = new StreamReader(stream)) { string line = sr.ReadLine(); while (!string.IsNullOrEmpty(line)) { ftpfileList.Add(new Ftpfile { isDir = line.IndexOf("<DIR>") > -1, name = line.Substring(39).Trim(),path= Path.Combine(dirName, line.Substring(39).Trim()) }); line = sr.ReadLine(); } sr.Close(); } return ftpfileList; }); } /// <summary> /// 獲取目錄下的所有目錄及文件包括其子目錄和子文件 /// </summary> /// param name="ftpfileList"></param> /// <param name="dirName"></param> /// <returns></returns> public List<Ftpfile> getAllFtpFile(List<Ftpfile> ftpfileList, string dirName, int level = 0) { var flist = new List<Ftpfile>(); string uri = Path.Combine(ftpURI, dirName); return MethodInvoke($@"getFile({dirName})", () => { var a = new List<List<string>>(); FtpWebRequest ftp = GetRequest(uri); ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails; Stream stream = ftp.GetResponse().GetResponseStream(); using (StreamReader sr = new StreamReader(stream)) { string line = sr.ReadLine(); while (!string.IsNullOrEmpty(line)) { flist.Add(new Ftpfile { isDir = line.IndexOf("<DIR>") > -1, name = line.Substring(39).Trim(), level = level, path= Path.Combine(dirName ,line.Substring(39).Trim()) }); ftpfileList.Add(new Ftpfile { isDir = line.IndexOf("<DIR>") > -1, name = line.Substring(39).Trim(), level = level, path = Path.Combine(dirName, line.Substring(39).Trim()) }); line = sr.ReadLine(); } sr.Close(); } var nflist = flist.Where(x => x.isDir).ToList(); if (nflist.Count == 0) return ftpfileList; else return getAllFtpFile(ftpfileList, Path.Combine(dirName, nflist.First().name), level + 1); }); } /// </summary> /// 在ftp服務(wù)器上創(chuàng)建指定目錄,父目錄不存在則創(chuàng)建 /// </summary> /// <param name="dirName">創(chuàng)建的目錄名稱</param> public bool makeDir(string dirName) { var dirs = dirName.Split('\\').ToList();//針對多級目錄分割 string currentDir = string.Empty; return MethodInvoke($@"makeDir({dirName})", () => { foreach (var dir in dirs) { if (!checkDir(dir, currentDir))//檢查目錄不存在則創(chuàng)建 { currentDir = Path.Combine(currentDir, dir); string uri = Path.Combine(ftpURI, currentDir); FtpWebRequest ftp = GetRequest(uri); ftp.Method = WebRequestMethods.Ftp.MakeDirectory; FtpWebResponse response = (FtpWebResponse)ftp.GetResponse(); response.Close(); } else { currentDir = Path.Combine(currentDir, dir); } } }); } /// <summary> /// 刪除單個文件 /// </summary> /// <param name="filePath"></param> public bool delFile(string filePath) { string uri = Path.Combine(ftpURI, filePath); return MethodInvoke($@"deleteFile({filePath})", () => { FtpWebRequest ftp = GetRequest(uri); ftp.Method = WebRequestMethods.Ftp.DeleteFile; FtpWebResponse response = (FtpWebResponse)ftp.GetResponse(); response.Close(); }); } /// <summary> /// 刪除最末及空目錄 /// </summary> /// <param name="dirName"></param> private bool delDir(string dirName) { string uri = Path.Combine(ftpURI, dirName); return MethodInvoke($@"delDir({dirName})", () => { FtpWebRequest ftp = GetRequest(uri); ftp.Method = WebRequestMethods.Ftp.RemoveDirectory; FtpWebResponse response = (FtpWebResponse)ftp.GetResponse(); response.Close(); }); } /// <summary> 刪除目錄或者其目錄下所有的文件 </summary> /// <param name="dirName">目錄名稱</param> /// <param name="ifDelSub">是否刪除目錄下所有的文件</param> public void delDirAll(string dirName) { var dlist = getAllFtpFile(new List<Ftpfile>(),dirName); dlist.OrderByDescending(x => x.level);//降序排列,先刪除末及文件或空目錄 string uri = Path.Combine(ftpURI, dirName); MethodInvoke($@"delDirAll({dirName})", () => { foreach (var item in dlist) { if (item.isDir)//判斷是目錄調(diào)用目錄的刪除方法 delDir(item.path); else delFile(item.path); } }); } /// <summary>文件重命名 </summary> /// <param name="currentFilename">當(dāng)前名稱</param> /// <param name="newFilename">重命名名稱</param> /// <param name="currentFilename">所在的目錄</param> public bool Rename(string currentFilename, string newFilename, string dirName = "") { string uri = Path.Combine(ftpURI, dirName, currentFilename); return MethodInvoke($@"Rename({currentFilename},{newFilename},{dirName})", () => { FtpWebRequest ftp = GetRequest(uri); ftp.Method = WebRequestMethods.Ftp.Rename; ftp.RenameTo = newFilename; FtpWebResponse response = (FtpWebResponse)ftp.GetResponse(); response.Close(); }); } /// <summary> /// 下載單個文件 /// </summary> /// <param name="ftpFilePath">從ftp要下載的文件路徑</param> /// <param name="localDir">下載至本地路徑</param> /// <param name="filename">文件名</param> public bool downloadFile(string ftpFilePath, string saveDir, string filename) { string tmpname = Guid.NewGuid().ToString(); string uri = Path.Combine(ftpURI, ftpFilePath); return MethodInvoke($@"downloadFile({ftpFilePath},{saveDir},{filename})", () => { if (!Directory.Exists(saveDir)) Directory.CreateDirectory(saveDir); FtpWebRequest ftp = GetRequest(uri); ftp.Method = WebRequestMethods.Ftp.DownloadFile; using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse()) { using (Stream responseStream = response.GetResponseStream()) { using (FileStream fs = new FileStream(Path.Combine(saveDir, filename), FileMode.CreateNew)) { byte[] buffer = new byte[2048]; int read = 0; do { read = responseStream.Read(buffer, 0, buffer.Length); fs.Write(buffer, 0, read); } while (!(read == 0)); responseStream.Close(); fs.Flush(); fs.Close(); } responseStream.Close(); } response.Close(); } }); } /// <summary> /// 從FTP下載整個文件夾 /// </summary> /// <param name="dirName">FTP文件夾路徑</param> /// <param name="saveDir">保存的本地文件夾路徑</param> public void downloadAllFile(string dirName, string saveDir) { MethodInvoke($@"downloadAllFile({dirName},{saveDir})", () => { List<Ftpfile> files = getFtpFile(dirName); if (!Directory.Exists(saveDir)) { Directory.CreateDirectory(saveDir); } foreach (var f in files) { if (f.isDir) //文件夾,遞歸查詢 { downloadAllFile(Path.Combine(dirName + f.name), Path.Combine(saveDir + f.name)); } else //文件,直接下載 { downloadFile(Path.Combine(dirName + f.name), saveDir, f.name); } } }); } } public class Ftpfile { public int level { get; set; } = 0; public bool isDir { get; set; } public string name { get; set; } public string path { get; set; } = ""; }
以上所述是小編給大家介紹的C#開發(fā)教程之ftp操作方法整理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對我們網(wǎng)站的支持!
上一篇:BootStrap mvcpager分頁樣式(get請求,刷新頁面)
欄 目:C#教程
下一篇:快速解決owin返回json字符串多帶了雙引號"多了重string轉(zhuǎn)義字符串
本文標(biāo)題:C#開發(fā)教程之ftp操作方法整理
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6329.html
您可能感興趣的文章
- 01-10C#一個簡單的定時小程序?qū)崿F(xiàn)代碼
- 01-10微信開放平臺之網(wǎng)站授權(quán)微信登錄功能
- 01-10C#調(diào)用WebService實例開發(fā)
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量二
- 01-10C#編程自學(xué)之開篇介紹
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量三
- 01-10C#編程自學(xué)之運算符和表達(dá)式
- 01-10實現(xiàn)ASP.NET無刷新下載并提示下載完成的開發(fā)思路
- 01-10C#編程自學(xué)之類和對象
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量一


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實例總結(jié)
- 04-02jquery與jsp,用jquery