/// <summary> /// 仅支持 ftp: /// </summary> public class FTPDownFile { #region 参数 public string ftpServerIP; protected string ftpUserID; protected string ftpPassword; private FtpWebRequest reqFTP; #endregion #region 构造 /// <summary> /// ftp登录信息 /// </summary> /// <param name="ServerIP"></param> /// <param name="UserID"></param> /// <param name="Password"></param> public FTPDownFile(string ServerIP,string UserID,string Password) { ftpServerIP = ServerIP; ftpUserID = UserID; ftpPassword = Password; } #endregion #region 连接 /// <summary> /// 连接ftp /// </summary> /// <param name="path"></param> private void Connect(String path) { reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(path)); // 指定数据传输类型 reqFTP.UseBinary = true; // ftp用户名和密码 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); } #endregion #region 获取文件列表 /// <summary> /// 获取文件列表 /// </summary> /// <param name="path"></param> /// <param name="WRMethods"></param> /// <returns></returns> private string[] GetFileList(string path, string WRMethods) { string[] downloadFiles; System.Text.StringBuilder result = new System.Text.StringBuilder(); try { Connect(path); reqFTP.Method = WRMethods; WebResponse response = reqFTP.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8);//中文文件名 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; } } /// <summary> /// 从ftp服务器上获得文件列表 /// </summary> /// <param name="path"></param> /// <returns></returns> public string[] GetFileList(string path) { return GetFileList("ftp://" + ftpServerIP + "/" + path, WebRequestMethods.Ftp.ListDirectory); } /// <summary> /// 从ftp服务器上获得文件列表 /// </summary> /// <returns></returns> public string[] GetFileList() { return GetFileList("ftp://" + ftpServerIP + "/", WebRequestMethods.Ftp.ListDirectory); } #endregion #region 获得文件明细 /// <summary> /// /// </summary> /// <returns></returns> public string[] GetFilesDetailList() { return GetFileList("ftp://" + ftpServerIP + "/", WebRequestMethods.Ftp.ListDirectoryDetails); } /// <summary> /// /// </summary> /// <param name="path"></param> /// <returns></returns> public string[] GetFilesDetailList(string path) { path = path.Replace("//", "/"); return GetFileList("ftp://" + path, WebRequestMethods.Ftp.ListDirectoryDetails); } #endregion #region 上传文件 /// <summary> /// 上传文件 /// </summary> /// <param name="filename"></param> public bool Upload(string filename, string path, out string errorinfo) { path = path.Replace("//", "/"); FileInfo fileInf = new FileInfo(filename); string uri = "ftp://" + path + "/" + 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) { path = path.Replace("//", "/"); FileInfo fileInf = new FileInfo(filename); 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="filePath"></param> /// <param name="fileName"></param> /// <param name="errorinfo"></param> /// <returns></returns> public bool Download(string ftpfilepath, string filePath, string fileName, out string errorinfo) { try { filePath = filePath.Replace("我的电脑//", ""); String onlyFileName = Path.GetFileName(fileName); string newFileName = Path.Combine(filePath, onlyFileName); FileInfo info = new FileInfo(newFileName); if (File.Exists(newFileName) && info.Length > 0) { errorinfo = string.Format("本地文件{0}已存在,无法下载", newFileName); return false; } //防止下了个空文件 if (info.Length == 0) { info.Delete(); } ftpfilepath = ftpfilepath.Replace("//", "/"); string url = "ftp://" + ftpfilepath; Connect(url);//连接 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 bool Download(string ftpfilepath, string filePath) { ftpfilepath = ftpfilepath.Replace("//", "/"); string url = "ftp://" + ftpfilepath; string fName, sPath; fName = Path.GetFileName(ftpfilepath); sPath = Path.Combine(filePath, fName); FileInfo info =new FileInfo(sPath); if (File.Exists(sPath) && info.Length>0) { Console.WriteLine(string.Format("本地文件{0}已存在,无法下载", sPath)); return false; } if (info.Length == 0) { info.Delete(); } WebClient client = new WebClient(); client.Credentials = new NetworkCredential(ftpUserID, ftpPassword); try { client.DownloadProgressChanged += delegate { Console.Write("="); }; client.DownloadFileCompleted += delegate(object sender, AsyncCompletedEventArgs e) { if (e.Error != null) Console.WriteLine(e.Error.Message); else Console.WriteLine(fName + "下载结束"); }; client.DownloadFileAsync(new Uri(url), sPath); while (client.IsBusy) { System.Threading.Thread.Sleep(1000); } } catch (Exception ee) { Console.WriteLine(ee.Message); return false; } finally { client.Dispose(); } return true; } #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) { throw ex; } } #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) { throw ex; } } #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) { throw ex; } } #endregion #region 获得ftp上文件大小 /// <summary> /// 获得ftp上文件大小 /// </summary> /// <param name="filename"></param> /// <returns></returns> public long GetFileSize(string filename) { long fileSize = 0; filename = filename.Replace("//", "/"); try { string uri = "ftp://" + filename; Connect(uri);//连接 reqFTP.Method = WebRequestMethods.Ftp.GetFileSize; FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); fileSize = response.ContentLength; response.Close(); } catch (Exception ex) { throw ex; } 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(); response.Close(); } catch (Exception ex) { throw ex; } } #endregion }