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
    }

  

posted @ 2019-07-03 11:00  翻白眼的哈士奇  阅读(1244)  评论(0编辑  收藏  举报