using System; using System.Collections.Generic; using System.Drawing.Printing; using System.IO; using System.Linq; using System.Net; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Web; namespace 常用工具集.Utility.Network { public class FtpHelper { private string ip; private int port = 21; private string ftpUserId; private string ftpPassword; private Encoding encoding; private string FtpUrl { get { return $"ftp://{ip}:{port}/"; } } public FtpHelper(string ip) : this(ip, 21) { } public FtpHelper(string ip, int port) : this(ip, 21, Encoding.GetEncoding("GB2312")) { } /// /// 匿名 /// /// public FtpHelper(string ip, Encoding encoding) : this(ip, 21, encoding) { } public FtpHelper(string ip, int port, Encoding encoding) : this(ip, port, "anonymous", "", encoding) { } public FtpHelper(string ip, string userName, string password) : this(ip, 21, userName, password) { } public FtpHelper(string ip, int port, string userName, string password) : this(ip, port, userName, password, Encoding.UTF8) { } /// /// 指定用户名密码 /// /// /// /// public FtpHelper(string ip, string userName, string password, Encoding encoding) : this(ip, 21, userName, password, encoding) { } /// /// 指定用户名密码 /// /// /// /// public FtpHelper(string ip, int port, string userName, string password, Encoding encoding) { this.ip = ip; this.port = port; this.ftpUserId = userName; this.ftpPassword = password; this.encoding = encoding; } /// /// 获得文件的最后更新时间 /// /// /// /// /// /// public DateTime GetFileLastModified(string ftpPath) { try { string url = Uri.EscapeUriString(FtpUrl + ftpPath); FtpWebRequest request = null; request = (FtpWebRequest)WebRequest.Create(new Uri(url)); request.UseBinary = true; request.Credentials = new NetworkCredential(ftpUserId, ftpPassword); request.Method = WebRequestMethods.Ftp.GetDateTimestamp; FtpWebResponse response = (FtpWebResponse)request.GetResponse(); DateTime dt = response.LastModified; response.Close(); response = null; request = null; return dt; } catch (Exception ex) { Console.WriteLine("FtpUtil.GetFileLastModified 获得文件的最后更新时间 错误"); throw ex; } } /// /// 列出ftp目录下的所有文件 /// /// /// /// /// public List GetList(string ftpPath) { List fileList = GetFileDetail(ftpPath); List list = new List(); try { string url = Uri.EscapeUriString(FtpUrl + ftpPath); FtpWebRequest request = null; request = (FtpWebRequest)WebRequest.Create(new Uri(url)); request.Credentials = new NetworkCredential(ftpUserId, ftpPassword); request.Method = WebRequestMethods.Ftp.ListDirectory; FtpWebResponse response = (FtpWebResponse)request.GetResponse(); Stream responseStream = response.GetResponseStream(); MemoryStream stream = new MemoryStream(); byte[] bArr = new byte[1024 * 1024]; int size = responseStream.Read(bArr, 0, (int)bArr.Length); while (size > 0) { stream.Write(bArr, 0, size); size = responseStream.Read(bArr, 0, (int)bArr.Length); } stream.Seek(0, SeekOrigin.Begin); responseStream.Close(); string str = encoding.GetString(stream.ToArray()); foreach (string line in str.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries)) { if (line == "." || line == "..") continue; string detail = fileList.Where(it => it.EndsWith(line)).FirstOrDefault(); if (detail == null || detail.Length == 0) { continue; } if (detail.ToUpper().Contains("") || detail.ToUpper().Contains("DR")) { list.Add(new FtpFileInfo { IsDirectory = true, Name = line }); } else { list.Add(new FtpFileInfo { IsDirectory = false, Name = line }); } } return list.OrderByDescending(it => it.IsDirectory).ToList(); } catch (Exception ex) { Console.WriteLine("FtpUtil.GetFile 列出ftp目录下的所有文件 错误"); throw ex; } } public List GetFileDetail(string ftpPath) { List list = new List(); try { string url = Uri.EscapeUriString(FtpUrl + ftpPath); FtpWebRequest request = null; request = (FtpWebRequest)WebRequest.Create(new Uri(url)); request.Credentials = new NetworkCredential(ftpUserId, ftpPassword); request.Method = WebRequestMethods.Ftp.ListDirectoryDetails; FtpWebResponse response = (FtpWebResponse)request.GetResponse(); Stream responseStream = response.GetResponseStream(); MemoryStream stream = new MemoryStream(); byte[] bArr = new byte[1024 * 1024]; int size = responseStream.Read(bArr, 0, (int)bArr.Length); while (size > 0) { stream.Write(bArr, 0, size); size = responseStream.Read(bArr, 0, (int)bArr.Length); } stream.Seek(0, SeekOrigin.Begin); responseStream.Close(); string str = encoding.GetString(stream.ToArray()); foreach (string line in str.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries)) { list.Add(line); } return list; } catch (Exception ex) { Console.WriteLine("FtpUtil.GetFile 列出ftp目录下的所有文件 错误"); throw ex; } } /// /// 判断是否是文件 /// /// /// /// /// /// public bool IsFileExist(string ftpPath, string fileName) { List list = GetList(ftpPath); if (list.Any(it => !it.IsDirectory && it.Name == fileName)) { return true; } return false; } #region 文件夹是否存在 /// /// 文件夹是否存在 /// /// /// /// public bool FolderExists(string ftpPath, string folderName) { List list = GetList(ftpPath); if (list.Any(it => it.IsDirectory && it.Name == folderName)) { return true; } return false; } #endregion #region 创建文件夹 /// /// 创建文件夹 /// /// ftp路径 /// 文件夹名称 public bool CreateFolder(string ftpPath) { try { string url = Uri.EscapeUriString(FtpUrl + ftpPath); FtpWebRequest request = null; request = (FtpWebRequest)WebRequest.Create(new Uri(url)); request.Credentials = new NetworkCredential(ftpUserId, ftpPassword); request.Method = "MKD"; ((FtpWebResponse)request.GetResponse()).Close(); return true; } catch (Exception ex) { return false; } } #endregion #region 文件是否存在 /// /// 文件是否存在 /// /// ftp路径 /// 用户名 /// 密码 /// 文件相对路径 public bool FileExists(string ftpPath) { try { string url = Uri.EscapeUriString(FtpUrl + ftpPath); FtpWebRequest request = null; string folderName = Path.GetDirectoryName(ftpPath); string fileName = Path.GetFileName(ftpPath); request = (FtpWebRequest)WebRequest.Create(new Uri(url)); request.Credentials = new NetworkCredential(ftpUserId, ftpPassword); request.Method = "LIST"; FtpWebResponse response = (FtpWebResponse)request.GetResponse(); Stream responseStream = response.GetResponseStream(); MemoryStream stream = new MemoryStream(); byte[] bArr = new byte[1024 * 1024]; int size = responseStream.Read(bArr, 0, (int)bArr.Length); while (size > 0) { stream.Write(bArr, 0, size); size = responseStream.Read(bArr, 0, (int)bArr.Length); } stream.Seek(0, SeekOrigin.Begin); responseStream.Close(); string str = encoding.GetString(stream.ToArray()); foreach (string line in str.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries)) { if (!line.ToUpper().Contains("DIR") && !line.ToUpper().Contains("DR")) { int pos = line.LastIndexOf(" "); string strFileName = line.Substring(pos).Trim(); if (strFileName == fileName) { return true; } } } } catch (Exception ex) { Console.WriteLine("FtpUtil.FileExists 判断文件是否存在 错误"); throw ex; } return false; } #endregion #region 下载文件 /// /// 下载文件 /// /// ftp路径 /// 用户名 /// 密码 /// 文件相对路径 public MemoryStream DownloadFile(string ftpPath) { try { string url = Uri.EscapeUriString(FtpUrl + ftpPath); FtpWebRequest request = null; request = (FtpWebRequest)WebRequest.Create(new Uri(url)); request.Credentials = new NetworkCredential(ftpUserId, ftpPassword); request.Method = "RETR"; FtpWebResponse response = (FtpWebResponse)request.GetResponse(); Stream responseStream = response.GetResponseStream(); MemoryStream stream = new MemoryStream(); byte[] bArr = new byte[1024 * 1024]; int size = responseStream.Read(bArr, 0, (int)bArr.Length); while (size > 0) { stream.Write(bArr, 0, size); size = responseStream.Read(bArr, 0, (int)bArr.Length); } stream.Seek(0, SeekOrigin.Begin); responseStream.Close(); return stream; } catch (Exception ex) { Console.WriteLine("FtpUtil.DownloadFile 下载文件 错误"); throw ex; } } /// /// 下载文件 /// /// ftp路径 /// 用户名 /// 密码 /// 文件相对路径 public void DownloadFile(string ftpPath, string localFile) { try { string url = Uri.EscapeUriString(FtpUrl + ftpPath); FtpWebRequest request = null; request = (FtpWebRequest)WebRequest.Create(new Uri(url)); request.Credentials = new NetworkCredential(ftpUserId, ftpPassword); request.Method = "RETR"; FtpWebResponse response = (FtpWebResponse)request.GetResponse(); Stream responseStream = response.GetResponseStream(); FileStream stream = new FileStream(localFile, FileMode.OpenOrCreate, FileAccess.Write); byte[] bArr = new byte[1024 * 1024]; int size = responseStream.Read(bArr, 0, (int)bArr.Length); while (size > 0) { stream.Write(bArr, 0, size); size = responseStream.Read(bArr, 0, (int)bArr.Length); } stream.Seek(0, SeekOrigin.Begin); responseStream.Close(); stream.Dispose(); } catch (Exception ex) { Console.WriteLine("FtpUtil.DownloadFile 下载文件 错误"); throw ex; } } #endregion #region 异步下载文件 /// /// 异步下载文件 /// /// ftp路径 public async Task DownloadFileAsync(string ftpPath) { try { string url = Uri.EscapeUriString(FtpUrl + ftpPath); FtpWebRequest request = null; request = (FtpWebRequest)WebRequest.Create(new Uri(url)); request.Credentials = new NetworkCredential(ftpUserId, ftpPassword); request.Method = "RETR"; FtpWebResponse response = (FtpWebResponse)(await request.GetResponseAsync()); Stream responseStream = response.GetResponseStream(); MemoryStream stream = new MemoryStream(); byte[] bArr = new byte[1024 * 1024]; int size = await responseStream.ReadAsync(bArr, 0, (int)bArr.Length); while (size > 0) { stream.Write(bArr, 0, size); size = await responseStream.ReadAsync(bArr, 0, (int)bArr.Length); } stream.Seek(0, SeekOrigin.Begin); responseStream.Close(); return stream; } catch (Exception ex) { Console.WriteLine("FtpUtil.DownloadFileAsync 异步下载文件 错误"); throw ex; } } #endregion #region 上传文件 /// /// 上传文件 /// /// ftp路径 /// 文件相对路径 /// 文件内容 public bool UploadFile(string ftpPath, byte[] bArr) { try { string url = Uri.EscapeUriString(FtpUrl + ftpPath); FtpWebRequest request = null; request = (FtpWebRequest)WebRequest.Create(new Uri(url)); request.Credentials = new NetworkCredential(ftpUserId, ftpPassword); request.Method = "STOR"; Stream postStream = request.GetRequestStream(); int pageSize = 1024 * 1024; int index = 0; while (index < bArr.Length) { if (bArr.Length - index > pageSize) { postStream.Write(bArr, index, pageSize); index += pageSize; } else { postStream.Write(bArr, index, bArr.Length - index); index = index + (bArr.Length - index); } } postStream.Close(); FtpWebResponse response = (FtpWebResponse)request.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader sr = new StreamReader(responseStream, Encoding.UTF8); string result = sr.ReadToEnd(); responseStream.Close(); return true; } catch (Exception ex) { return false; } } /// /// 上传文件 /// /// 本地文件 /// 远端路径 /// public bool UploadFile(string localFilePath, string ftpPath) { try { string url = Uri.EscapeUriString(FtpUrl + ftpPath); byte[] bytes = new byte[1024 * 1024]; FtpWebRequest request = null; request = (FtpWebRequest)WebRequest.Create(new Uri(url)); request.Credentials = new NetworkCredential(ftpUserId, ftpPassword); request.Method = "STOR"; FileStream stream = new FileStream(localFilePath, FileMode.Open); Stream postStream = request.GetRequestStream(); while (true) { int count = stream.Read(bytes, 0, bytes.Length); if (count == 0) break; postStream.Write(bytes, 0, count); } postStream.Close(); FtpWebResponse response = (FtpWebResponse)request.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader sr = new StreamReader(responseStream, Encoding.UTF8); string result = sr.ReadToEnd(); responseStream.Close(); return true; } catch (Exception ex) { return false; } } #endregion #region 删除文件 /// /// 删除文件 /// /// ftp路径 /// 用户名 /// 密码 /// 文件相对路径 public bool DeleteFile(string ftpPath) { try { string url = Uri.EscapeUriString(FtpUrl + ftpPath); FtpWebRequest request = null; request = (FtpWebRequest)WebRequest.Create(new Uri(url)); request.Credentials = new NetworkCredential(ftpUserId, ftpPassword); request.Method = WebRequestMethods.Ftp.DeleteFile; ((FtpWebResponse)request.GetResponse()).Close(); return true; } catch (Exception ex) { throw ex; } } public bool Rename(string ftpPath, string newName) { try { string url = Uri.EscapeUriString(FtpUrl + ftpPath); FtpWebRequest request = null; request = (FtpWebRequest)WebRequest.Create(new Uri(url)); request.Credentials = new NetworkCredential(ftpUserId, ftpPassword); request.Method = WebRequestMethods.Ftp.Rename; request.RenameTo = newName; ((FtpWebResponse)request.GetResponse()).Close(); return true; } catch (Exception ex) { throw ex; } } public bool DeleteDirectory(string ftpPath) { try { string url = Uri.EscapeUriString(FtpUrl + ftpPath); if (ftpPath.EndsWith("/")) ftpPath = ftpPath.Substring(0, ftpPath.Length - 1); FtpWebRequest request = null; request = (FtpWebRequest)WebRequest.Create(new Uri(url)); request.Credentials = new NetworkCredential(ftpUserId, ftpPassword); request.Method = WebRequestMethods.Ftp.RemoveDirectory; ((FtpWebResponse)request.GetResponse()).Close(); return true; } catch (Exception ex) { throw ex; } } #endregion } public class FtpFileInfo { public bool IsDirectory { get; set; } public string Name { get; set; } } }