ftp上传文件和下载文件
public class FtpService { #region Fields and attributes private readonly int BufLen = 2048; /// <summary> /// ftp服务器地址 /// </summary> private readonly string FtpServer = Properties.Settings.Default.FtpServer; /// <summary> /// ftp用户名 /// </summary> private readonly string FtpUser = Properties.Settings.Default.user; /// <summary> /// ftp密码 /// </summary> private readonly string FtpPassword = Properties.Settings.Default.password; #endregion #region Events /// <summary> /// 文件上传结果 /// </summary> /// <param>true-成功,false-失败</param> /// <param>信息</param> public event Action<bool, string> EventUploadResult = null; /// <summary> /// 文件上传进度 /// </summary> /// <param>文件已上传大小</param> /// <param>文件总大小</param> /// <param>文件名称</param> public event Action<long, long, string> EventUploadFileProgress = null; /// <summary> /// 所有文件上传进度 /// </summary> /// <param>文件已上传数</param> /// <param>文件总总数</param> public event Action<int, int> EventUploadBatchFilesProgress = null; /// <summary> /// 文件下载结果 /// </summary> /// <param>true-成功,false-失败</param> /// <param>信息</param> public event Action<bool, string> EventDonwloadResult = null; /// <summary> /// 文件下载进度 /// </summary> /// <param>文件已下载大小</param> /// <param>文件总大小</param> /// <param>文件名称</param> public event Action<long, long, string> EventDonwloadFileProgress = null; /// <summary> /// 所有文件下载进度 /// </summary> /// <param>文件已下载数</param> /// <param>文件总总数</param> public event Action<int, int> EventDonwloadBatchFilesProgress = null; #endregion #region public methods /// <summary> /// 上传文件到FTPServer /// </summary> /// <param name="file"></param> public bool UploadFile(string localFilePath) { if (string.IsNullOrEmpty(localFilePath)) return false; bool ret = true; FtpWebRequest reqFtp = null; try { FileInfo localFileInfo = new FileInfo(localFilePath); string serverFilePath = $@"{FtpServer}\{ localFileInfo.Name}"; //FtpWebRequest配置 reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(serverFilePath)); reqFtp.UseBinary = true; reqFtp.Credentials = new NetworkCredential(FtpUser, FtpPassword); //设置通信凭据 reqFtp.KeepAlive = false; reqFtp.Method = WebRequestMethods.Ftp.UploadFile; reqFtp.ContentLength = localFileInfo.Length; //读本地文件数据并上传 using (FileStream fileStream = localFileInfo.OpenRead()) { using (Stream stream = reqFtp.GetRequestStream()) { long totalLen = 0; int contentLen = 0; byte[] buff = new byte[BufLen]; while ((contentLen = fileStream.Read(buff, 0, BufLen)) > 0) { stream.Write(buff, 0, contentLen); totalLen += contentLen; if (EventUploadFileProgress != null) EventUploadFileProgress(totalLen, localFileInfo.Length, localFileInfo.Name); } } } ret = true; if (EventUploadResult != null) EventUploadResult(ret, $@"{localFilePath} : 上传成功!"); } catch (Exception ex) { ret = false; if (EventUploadResult != null) EventUploadResult(ret, $@"{localFilePath} : 上传失败!Exception : {ex.ToString()}"); } finally { if (reqFtp != null) reqFtp.Abort(); } return ret; } /// <summary> /// 从FTPServer上下载文件 /// </summary> public bool DownloadFile(string fileName, long length, string localDirectory) { if (string.IsNullOrEmpty(localDirectory) || string.IsNullOrEmpty(fileName)) return false; bool ret = true; FtpWebRequest reqFtp = null; FtpWebResponse respFtp = null; string localFilePath = $@"{localDirectory}\{fileName}"; string serverFilePath = $@"{FtpServer}\{fileName}"; try { if (File.Exists(localFilePath)) File.Delete(localFilePath); //建立ftp连接 reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(serverFilePath)); reqFtp.UseBinary = true; reqFtp.Credentials = new NetworkCredential(FtpUser, FtpPassword); reqFtp.KeepAlive = false; reqFtp.Method = WebRequestMethods.Ftp.DownloadFile; //读服务器文件数据并写入本地文件 respFtp = reqFtp.GetResponse() as FtpWebResponse; using (Stream stream = respFtp.GetResponseStream()) { using (FileStream fileStream = new FileStream(localFilePath, FileMode.Create)) { long totalLen = 0; int contentLen = 0; byte[] buff = new byte[BufLen]; while ((contentLen = stream.Read(buff, 0, BufLen)) > 0) { fileStream.Write(buff, 0, contentLen); totalLen += contentLen; if (EventDonwloadFileProgress != null && length > 0) EventDonwloadFileProgress(totalLen, length, fileName); } } } ret = true; if (EventDonwloadResult != null) EventDonwloadResult(ret, $@"{serverFilePath} : 下载成功!"); } catch (Exception ex) { ret = false; if (EventDonwloadResult != null) EventDonwloadResult(ret, $@"{serverFilePath} : 下载失败!Exception : {ex.ToString()}"); } finally { if (reqFtp != null) reqFtp.Abort(); if (respFtp != null) respFtp.Close(); } return ret; } /// <summary> /// 批量上传文件 /// </summary> /// <param name="localFilePaths"></param> public void UploadFiles(List<string> localFilePaths) { if (localFilePaths == null || localFilePaths.Count == 0) return; int i = 1; foreach (var localFilePath in localFilePaths) { UploadFile(localFilePath); if (EventUploadBatchFilesProgress != null) EventUploadBatchFilesProgress(i++, localFilePaths.Count); } } /// <summary> /// 批量下载文件 /// </summary> /// <param name="fileNames"></param> /// <param name="localDirectory"></param> public void DownloadFiles(List<FileModel> files, string localDirectory) { if (files == null || files.Count == 0 || string.IsNullOrEmpty(localDirectory)) return; int i = 1; foreach (var file in files) { DownloadFile(file.Name, file.Size, localDirectory); if (EventDonwloadBatchFilesProgress != null) EventDonwloadBatchFilesProgress(i++, files.Count); } } /// <summary> /// 异步上传文件到FTPServer /// </summary> /// <param name="file"></param> public async Task<bool> UploadFileAsync(string localFilePath) { if (string.IsNullOrEmpty(localFilePath)) return false; bool ret = true; FtpWebRequest reqFtp = null; try { FileInfo localFileInfo = new FileInfo(localFilePath); string serverFilePath = $@"{FtpServer}\{ localFileInfo.Name}"; //FtpWebRequest配置 reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(serverFilePath)); reqFtp.UseBinary = true; reqFtp.Credentials = new NetworkCredential(FtpUser, FtpPassword); //设置通信凭据 reqFtp.KeepAlive = false; reqFtp.Method = WebRequestMethods.Ftp.UploadFile; reqFtp.ContentLength = localFileInfo.Length; //读本地文件数据并上传 using (FileStream fileStream = localFileInfo.OpenRead()) { using (Stream stream = await reqFtp.GetRequestStreamAsync()) { long totalLen = 0; int contentLen = 0; byte[] buff = new byte[BufLen]; while ((contentLen = await fileStream.ReadAsync(buff, 0, BufLen)) > 0) { await stream.WriteAsync(buff, 0, contentLen); totalLen += contentLen; if (EventUploadFileProgress != null) EventUploadFileProgress(totalLen, localFileInfo.Length, localFileInfo.Name); } } } ret = true; if (EventUploadResult != null) EventUploadResult(ret, $@"{localFilePath} : 上传成功!"); } catch (Exception ex) { ret = false; if (EventUploadResult != null) EventUploadResult(ret, $@"{localFilePath} : 上传失败!Exception : {ex.ToString()}"); } finally { if (reqFtp != null) reqFtp.Abort(); } return ret; } /// <summary> /// 异步从FTPServer上下载文件 /// </summary> public async Task<bool> DownloadFileAsync(string fileName, long length, string localDirectory) { if (string.IsNullOrEmpty(localDirectory) || string.IsNullOrEmpty(fileName)) return false; bool ret = true; FtpWebRequest reqFtp = null; FtpWebResponse respFtp = null; string localFilePath = $@"{localDirectory}\{fileName}"; string serverFilePath = $@"{FtpServer}\{fileName}"; try { if (File.Exists(localFilePath)) File.Delete(localFilePath); //建立ftp连接 reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(serverFilePath)); reqFtp.UseBinary = true; reqFtp.Credentials = new NetworkCredential(FtpUser, FtpPassword); reqFtp.KeepAlive = false; reqFtp.Method = WebRequestMethods.Ftp.DownloadFile; //读服务器文件数据并写入本地文件 respFtp = await reqFtp.GetResponseAsync() as FtpWebResponse; using (Stream stream = respFtp.GetResponseStream()) { using (FileStream fileStream = new FileStream(localFilePath, FileMode.Create)) { long totalLen = 0; int contentLen = 0; byte[] buff = new byte[BufLen]; while ((contentLen = await stream.ReadAsync(buff, 0, BufLen)) > 0) { await fileStream.WriteAsync(buff, 0, contentLen); totalLen += contentLen; if (EventDonwloadFileProgress != null && length > 0) EventDonwloadFileProgress(totalLen, length, fileName); } } } ret = true; if (EventDonwloadResult != null) EventDonwloadResult(ret, $@"{serverFilePath} : 下载成功!"); } catch (Exception ex) { ret = false; if (EventDonwloadResult != null) EventDonwloadResult(ret, $@"{serverFilePath} : 下载失败!Exception : {ex.ToString()}"); } finally { if (reqFtp != null) reqFtp.Abort(); if (respFtp != null) respFtp.Close(); } return ret; } /// <summary> /// 异步批量上传文件 /// </summary> /// <param name="localFilePaths"></param> public async void UploadFilesAsync(List<string> localFilePaths) { if (localFilePaths == null || localFilePaths.Count == 0) return; int i = 1; foreach (var localFilePath in localFilePaths) { await UploadFileAsync(localFilePath); if (EventUploadBatchFilesProgress != null) EventUploadBatchFilesProgress(i++, localFilePaths.Count); } } /// <summary> /// 异步批量下载文件 /// </summary> /// <param name="fileNames"></param> /// <param name="localDirectory"></param> public async void DownloadFilesAsync(List<FileModel> files, string localDirectory) { if (files == null || files.Count == 0 || string.IsNullOrEmpty(localDirectory)) return; int i = 1; foreach (var file in files) { await DownloadFileAsync(file.Name, file.Size, localDirectory); if (EventDonwloadBatchFilesProgress != null) EventDonwloadBatchFilesProgress(i++, files.Count); System.Threading.Thread.Sleep(1000); } } /// <summary> /// 读取远程文件的内容 /// </summary> /// <param name="path"></param> /// <returns></returns> public string ReadFromFile(string serverFilePath) { if (string.IsNullOrEmpty(serverFilePath)) return ""; string ret = ""; FtpWebRequest reqFtp = null; FtpWebResponse respFtp = null; try { //建立ftp连接 reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(serverFilePath)); reqFtp.UseBinary = true; reqFtp.Credentials = new NetworkCredential(FtpUser, FtpPassword); reqFtp.KeepAlive = false; reqFtp.Method = WebRequestMethods.Ftp.DownloadFile; respFtp = reqFtp.GetResponse() as FtpWebResponse; using (Stream stream = respFtp.GetResponseStream()) { using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) { ret = reader.ReadToEnd(); } } } catch (Exception ex) { ret = ""; throw ex; } finally { if (reqFtp != null) reqFtp.Abort(); if (respFtp != null) respFtp.Close(); } return ret; } /// <summary> /// 读取远程文件的内容 /// </summary> /// <param name="path"></param> /// <returns></returns> public async Task<string> ReadFromFileAsync(string serverFilePath) { if (string.IsNullOrEmpty(serverFilePath)) return ""; string ret = ""; FtpWebRequest reqFtp = null; FtpWebResponse respFtp = null; try { //建立ftp连接 reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(serverFilePath)); reqFtp.UseBinary = true; reqFtp.Credentials = new NetworkCredential(FtpUser, FtpPassword); reqFtp.KeepAlive = false; reqFtp.Method = WebRequestMethods.Ftp.DownloadFile; respFtp = reqFtp.GetResponse() as FtpWebResponse; using (Stream stream = respFtp.GetResponseStream()) { using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) { ret = await reader.ReadToEndAsync(); } } } catch (Exception ex) { ret = ""; throw ex; } finally { if (reqFtp != null) reqFtp.Abort(); if (respFtp != null) respFtp.Close(); } return ret; } #endregion }