C# FTP操作类
前段时间完成来了个项目,中间用到ftp读取、上传文件等操作,也就写了这个FTP类库,发上来给大家共享共享......
//添加引用 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Diagnostics; using System.Web; using System.Net; using System.Collections.Generic; namespace Yang.FTP { public class Function { /// <summary> /// FTP上传文件 /// </summary> /// <param name="filename"></param> public static string Upload(string Fromfilename, string Tofilename, string ftpServerIP, string ftpUserID, string ftpPassword) { string sRet = "OK"; FileInfo fileInf = new FileInfo(Fromfilename); string uri = "ftp://" + ftpServerIP + "/" + Tofilename; FtpWebRequest reqFTP; // 根据uri创建FtpWebRequest对象 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); // ftp用户名和密码 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); // 默认为true,连接不会被关闭 // 在一个命令之后被执行 reqFTP.KeepAlive = false; // 指定执行什么命令 reqFTP.Method = WebRequestMethods.Ftp.UploadFile; // 指定数据传输类型 reqFTP.UseBinary = true; reqFTP.UsePassive = false; // 上传文件时通知服务器文件的大小 reqFTP.ContentLength = fileInf.Length; // 缓冲大小设置为2kb int buffLength = 2048; byte[] buff = new byte[buffLength]; int contentLen; // 打开一个文件流 (System.IO.FileStream) 去读上传的文件 FileStream fs = fileInf.OpenRead(); try { // 把上传的文件写入流 Stream strm = reqFTP.GetRequestStream(); // 每次读文件流的2kb 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"); //throw (ex); sRet = ex.Message; } return sRet; } /// <summary> /// FTP下载文件 /// </summary> /// <param name="filePath"></param> /// <param name="fileName"></param> public static string Download(string fromFilePath, string fileName, string ftpServerIP, string ftpUserID, string ftpPassword, string TermID) { string sRet = "OK"; FtpWebRequest reqFTP; try { string filePath = Environment.CurrentDirectory + "\\Data\\" + TermID; if (!System.IO.Directory.Exists(filePath)) { Directory.CreateDirectory(filePath); } filePath = filePath + "\\" + fileName; fromFilePath = fromFilePath + "\\" + fileName; if (File.Exists(filePath)) File.Delete(filePath); reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + fromFilePath)); reqFTP.Method = WebRequestMethods.Ftp.DownloadFile; reqFTP.UseBinary = true; reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); reqFTP.UsePassive = false; 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(filePath, FileMode.Create); while (readCount > 0) { outputStream.Write(buffer, 0, readCount); readCount = ftpStream.Read(buffer, 0, bufferSize); } outputStream.Flush(); outputStream.Close(); ftpStream.Close(); response.Close(); } catch (Exception ex) { //MessageBox.Show(ex.Message); //throw (ex); sRet = ex.Message; } return sRet; } /// <summary> /// FTP创建目录 /// </summary> /// <param name="ftpServerIP"></param> /// <param name="ftpUserID"></param> /// <param name="ftpPassword"></param> /// <param name="TermID"></param> /// <param name="dirName"></param> /// <returns></returns> public static string MakeDir(string dirName, string ftpServerIP, string ftpUserID, string ftpPassword) { string sRet = "OK"; try { string uri = "ftp://" + ftpServerIP + "/" + dirName; FtpWebRequest reqFTP; // 根据uri创建FtpWebRequest对象 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); // ftp用户名和密码 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); // 默认为true,连接不会被关闭 // 在一个命令之后被执行 reqFTP.KeepAlive = false; // 指定执行什么命令 reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory; // 指定数据传输类型 reqFTP.UseBinary = true; FtpWebResponse respFTP = (FtpWebResponse)reqFTP.GetResponse(); respFTP.Close(); } catch (Exception ex) { sRet = ex.Message; } return sRet; } /// <summary> /// 获取文件列表 /// </summary> /// <returns></returns> public static string[] GetFileList(string ftpServerIP, string ftpUserID, string ftpPassword) { string[] downloadFiles; StringBuilder result = new StringBuilder(); FtpWebRequest reqFTP; try { reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/")); 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) { Console.WriteLine(ex.Message); downloadFiles = null; return downloadFiles; } } /// <summary> /// 获取目录列表 /// </summary> /// <returns></returns> public static List<string> GetDirList(string ftpServerIP, string ftpUserID, string ftpPassword, string dirName, string fileOrDir) { List<string> downloadFiles = new List<string>(); StringBuilder result = new StringBuilder(); FtpWebRequest reqFTP; try { reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + dirName)); reqFTP.UseBinary = true; reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails; 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(); string[] strsFileList = result.ToString().Split('\n'); if (fileOrDir.ToLower() == "f") { fileOrDir = "-rw-rw-rw"; } else { fileOrDir = "drw-rw-rw"; } //解析文件夹 foreach (string s in strsFileList) { if (s.IndexOf(fileOrDir) >= 0) { string s2 = ""; string[] sl1 = s.Split(' '); int j = 0; for (int i = 0; i < sl1.Length; i++) { //非空项 if (sl1[i] != "") { j++; } //超过9以上开始系文件夹 if (j > 8) { s2 = sl1[i] + " "; } } s2 = s2.Trim(); if (s2 != "." && s2 != "..") { downloadFiles.Add(s2); } } } return downloadFiles; } catch (Exception ex) { Console.WriteLine(ex.Message); //downloadFiles = null; return downloadFiles; } } /// <summary> /// 删除指定文件 /// </summary> /// <param name="fileName">远程文件的路径【示例:uploads/myfile.rar】</param> public static string DeleteFileName(string fileName, string ftpServerIP, string ftpUserID, string ftpPassword) { string sRet = "OK"; string uri = "ftp://" + ftpServerIP + "/" + fileName; FtpWebRequest reqFTP; try { reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + fileName)); // 在一个命令之后被执行 reqFTP.KeepAlive = false; // 指定执行什么命令 reqFTP.Method = WebRequestMethods.Ftp.DeleteFile; reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); response.Close(); } catch (Exception ex) { sRet = ex.Message; } return sRet; } } }