C# ftpHelper

@C# ftp文件操作类ftpHelper

C# ftp文件操作类ftpHelper:

在C#对文件操作的时候,在百度和必应上搜索很多资料,但是没有一个很完善操作ftp文件的ftpHelper类,其他同学写的难免有些差强人意,之后自己想写一个完善的ftp文件操作类ftpHelper。这些方法在跟着阿笨一起玩NET的基础上扩展和整理,所有方法都经过验证,可以放心使用。如果其中有需要探讨的,给我留言即可。

ftpHelper操作类引用说明

1.文章的大部分类容是从https://cloud.tencent.com/developer/article/1343559这里看到的,本人在上面增加了几个方法,和优化返回内容;
2.对于所有的方法,本人已经经过验证,可以放心使用;
3.如果觉得这个ftpHelper还可以了,想给我点赞的同时,请不要忘了给我引用"跟着阿笨一起玩NET"点赞,谢谢;
4.具体的验证我上传到CSDN,0币下载,下载链接FtpHepler操作类下载;
5.如果对Windows FileHepler感兴趣,可以点击FileHepler下载

主要方法:

ftp操作的几个主要的方法

1.FTP初始化;
2.创建目录;
3.更改目录或文件名;
4.切换当前目录;
5.列出当前目录的所有文件;
6.列出当前目录的所有一级子目录;
7.判断当前目录下指定的子目录或文件是否存在;
8.判断当前目录下指定的子文件是否存在;
9.删除空目录;
10.删除目录(包括下面所有子目录和子文件)
11.删除文件;
12.下载单个文件;
13.批量下载当前目录下的所有文件与目录;
14.单个文件上传;
15.批量上传当前目录下的所有文件;
16.递归获取FTP服务器上的目录和文件信息
17.获取当前目录下的文件和文件夹;
18.获取当前目录一级字目录和文件信息;

主要截图:

1.下载界面,0币下载
0币下载

2.验证功能界面
在这里插入图片描述
3.FtpHepler内容
在这里插入图片描述

在这里插入图片描述

代码内容

/// <summary>
    /// FTP操作类
    /// </summary>
    public class FtpHelper
    {
        /// <summary>
        /// FTP请求对象
        /// </summary>
        FtpWebRequest request = null;
        /// <summary>
        /// FTP响应对象
        /// </summary>
        FtpWebResponse response = null;

        /// <summary>
        /// 文件内容
        /// </summary>
        List<FileStruct> fileLists = new List<FileStruct>();

        /// <summary>
        /// 多个消息实体
        /// </summary>
        List<OperationResult> operationResults = new List<OperationResult>();

        /// <summary>
        /// 单个消息实体
        /// </summary>
        OperationResult operationResult = new OperationResult();

        FilesHelper filesHelper = new FilesHelper();

        public string ftpServerIP;          //FTPIP
        public string ftpServerPort;        //FTP端口
        public string ftpRemotePath;        //FTP目标目录
        public string ftpUserID;            //FTP登录名
        public string ftpPassword;          //FTP密码
        public string Ipath;                //目标文件存放路径
        public string ftpURI;               //得到的FTPUrL
        public string ftpUrls;              //得到相对的Url

        #region FTP初始化
        /// <summary>
        /// 获取FTP的URL
        /// </summary>
        /// <param name="ftpServerIP"></param>
        /// <param name="ftpServerPort"></param>
        /// <param name="ftpRemotePath"></param>
        /// <param name="ftpUserID"></param>
        /// <param name="ftpPassword"></param>
        /// <param name="Ipath"></param>
        public string getFtpHelper(string ftpServerIP, string ftpServerPort, string ftpRemotePath, string ftpUserID, string ftpPassword, string Ipath)
        {
            this.ftpServerIP = ftpServerIP;
            this.ftpRemotePath = ftpRemotePath;
            this.ftpServerPort = ftpServerPort;
            this.Ipath = Ipath;
            this.ftpUserID = ftpUserID;
            this.ftpPassword = ftpPassword;
            this.ftpUrls = "ftp://" + ftpServerIP + ":" + ftpServerPort + "/";
            this.ftpURI = "ftp://" + ftpServerIP + ":" + ftpServerPort + "/" + ftpRemotePath + "/";
            return ftpURI;
        }

        /// <summary>       
        /// 建立FTP链接,返回请求对象       
        /// </summary>      
        /// <param name="uri">FTP地址</param>       
        /// <param name="ftpMethod">操作命令</param>       
        private FtpWebRequest FTPRequest(Uri uri, string ftpMethod)
        {
            request = (FtpWebRequest)WebRequest.Create(uri);
            request.Method = ftpMethod;
            request.UseBinary = true;
            request.KeepAlive = false;
            request.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
            return request;
        }

        /// <summary>
        /// 建立FTP链接,返回响应对象
        /// </summary>
        /// <param name="uri">请求的URL</param>
        /// <param name="ftpMethod">请求的方法</param>
        /// <returns></returns>
        private FtpWebResponse FTPResponse(Uri uri, string ftpMethod)
        {
            request = (FtpWebRequest)FtpWebRequest.Create(uri);
            request.Method = ftpMethod;
            request.UseBinary = true;
            request.KeepAlive = false;                                          //保持接,其他方法关闭
            request.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
            return (FtpWebResponse)request.GetResponse();
        }

        /// <summary>       
        /// 析构函数关闭连接,如果不了解析构函数,可以去网上查找C#析构函数    
        /// </summary>           
        ~FtpHelper()
        {
            if (response != null)
            {
                response.Close();
                response = null;
            }
            if (request != null)
            {
                request.Abort();
                request = null;
            }
        }
        #endregion


        #region 创建目录
        /// <summary>
        /// 创建目录
        /// </summary>
        /// <param name="remoteDirectoryName">目录名称</param>
        public OperationResult CreateDirectory(string remoteDirectoryName)
        {
            bool flag=IsExist(remoteDirectoryName);
            if (!flag)
            {
                try
                {
                    response = FTPResponse(new Uri(ftpUrls + ftpRemotePath + "/"  + remoteDirectoryName), WebRequestMethods.Ftp.MakeDirectory);
                    operationResult.isOk = true;
                    operationResult.tRes = string.Format("创建目录{0}成功", remoteDirectoryName);
                }
                catch (Exception ex)
                {
                    operationResult.isOk = false;
                    operationResult.tRes = string.Format("创建目录失败,失败原因:{0}", ex.ToString());
                }
            }
            else 
            {
                operationResult.isOk = true;
                operationResult.tRes = string.Format("目录{0}已存在", remoteDirectoryName);
            }
            return operationResult;
        }
        #endregion


        #region 更改目录或文件名
        /// <summary>
        /// 更改目录或文件名
        /// </summary>
        /// <param name="currentName">当前目录或者文件名</param>
        /// <param name="newName">修改后新目录或者文件名</param>
        public OperationResult ReName(string currentName, string newName)
        {
            try
            {
                request = FTPRequest(new Uri(ftpURI + currentName), WebRequestMethods.Ftp.Rename);
                request.RenameTo = newName;
                response = (FtpWebResponse)request.GetResponse();
                operationResult.isOk = true;
                operationResult.tRes = "更改目录或文件名成功";
            }
            catch (Exception ex)
            {
                operationResult.isOk = false;
                operationResult.tRes = string.Format("更改目录或文件名失败,失败原因:{0}", ex.ToString());
            }
            return operationResult;
        }
        #endregion


        #region 切换当前目录
        /// <summary>  
        /// 切换当前目录  
        /// </summary>  
        /// <param name="IsRoot">true:绝对路径 false:相对路径</param>   
        public void GotoDirectory(string DirectoryName, bool IsRoot)
        {
            if (IsRoot)
            {
                ftpRemotePath = DirectoryName;
            }
            else
            {
                ftpRemotePath += "/" + DirectoryName;
            }
            ftpURI = "ftp://" + ftpServerIP + ":" + ftpServerPort + "/" + ftpRemotePath + "/";
        }
        #endregion


        #region 列出当前目录的所有文件
        /// <summary>
        /// 列出当前目录的所有文件
        /// </summary>
        /// <param name="remoteDirectoryName">目录名</param>
        /// <param name="IsDir">是否包含子目录</param>
        /// <returns></returns>
        public List<FileStruct> ListFiles(string remoteDirectoryName, bool IsDir)
        {
            var listAll = getAllFilesAndDirectories(remoteDirectoryName, IsDir);
            var listFile = listAll.Where(m => m.IsDirectory == false).ToList();
            return listFile;
        }
        #endregion


        #region 列出当前目录的所有一级子目录
        /// <summary>       
        /// 列出当前目录的所有一级子目录       
        /// </summary>       
        public List<FileStruct> ListDirectories()
        {
            var listAll = ListFilesAndDirectories();
            var listFile = listAll.Where(m => m.IsDirectory == true).ToList();
            return listFile;
        }
        #endregion


        #region 判断当前目录下指定的子目录或文件是否存在
        /// <summary>       
        /// 判断当前目录下指定的子目录或文件是否存在       
        /// </summary>       
        /// <param name="remoteDirName">指定的目录或文件名</param>      
        public bool IsExist(string remoteDirName)
        {
            var list = ListFilesAndDirectories();
            if (list.Count(m => m.Name == remoteDirName) > 0)
            {
                return true;
            }
            return false;
        }
        #endregion


        #region 判断当前目录下指定的子文件是否存在
        /// <summary>
        /// 判断当前目录下指定的子文件是否存在
        /// </summary>
        /// <param name="remoteDirectoryName">目录名</param>
        /// <param name="IsDir">是否包含子文件夹</param>
        /// <param name="remoteFileName">远程文件名</param>
        /// <returns></returns>
        public bool IsFileExist(string remoteDirectoryName, bool IsDir, string remoteFileName)
        {
            var listFile = ListFiles(remoteDirectoryName, IsDir);
            if (listFile.Count(m => m.Name == remoteFileName) > 0)
            {
                return true;
            }
            return false;
        } 
        #endregion


        #region 删除空目录
        /// <summary>
        /// 删除空目录
        /// </summary>
        /// <param name="remoteDirectoryName">目录相对路径</param>
        public OperationResult RemoveNullDirectory(string remoteDirectoryName)
        {
            try
            {
                GotoDirectory(remoteDirectoryName, false);
                response = FTPResponse(new Uri(ftpURI), WebRequestMethods.Ftp.RemoveDirectory);
                operationResult.isOk = true;
                operationResult.tRes = "删除空目录成功";
            }
            catch (Exception ex)
            {
                operationResult.isOk = false;
                operationResult.tRes = string.Format("删除空目录成功失败,失败原因:{0}", ex.ToString());
            }
            return operationResult;
        }
        #endregion


        #region 删除目录(包括下面所有子目录和子文件)
        /// <summary>
        /// 删除目录(包括下面所有子目录和子文件)
        /// </summary>
        /// <param name="remoteDirectoryName">目录绝对路径</param>
        /// <param name="IsDir">是否删除子目录</param>
        public OperationResult RemoveDirectory(string remoteDirectoryName,bool IsDir)
        {
            fileLists = new List<FileStruct>();
            try
            {
                var listAll = getAllFilesAndDirectories(remoteDirectoryName,IsDir);
                if (listAll.Count > 0) 
                {
                    foreach (var m in listAll)
                    {
                        if (!m.IsDirectory)
                        {
                            DeleteFile(m.Path);
                        }
                        else  //那就删除子目录
                        {
                            GotoDirectory(m.Path, true);
                            response = FTPResponse(new Uri(ftpURI), WebRequestMethods.Ftp.RemoveDirectory);
                        }
                    }
                }
                if (IsDir) 
                {
                    GotoDirectory(remoteDirectoryName, true);
                    response = FTPResponse(new Uri(ftpURI), WebRequestMethods.Ftp.RemoveDirectory);
                }
                operationResult.isOk = true;
                operationResult.tRes = String.Format("删除目录{0}成功", remoteDirectoryName);
            }
            catch (Exception ex)
            {
                operationResult.isOk = false;
                operationResult.tRes = string.Format("删除目录{0}成功失败,失败原因:{1}", remoteDirectoryName, ex.ToString());
            }
            return operationResult;
        }
        #endregion


        #region 删除文件
        /// <summary>  
        /// 删除文件  
        /// </summary>  
        /// <param name="remoteFileName">要删除的文件名,FTP+相对路径</param>
        public void DeleteFile(string remoteFileName)
        {
            response = FTPResponse(new Uri(ftpUrls+ remoteFileName), WebRequestMethods.Ftp.DeleteFile);
        }
        #endregion


        #region 下载单个文件
        /// <summary>
        /// 下载单个文件
        /// </summary>
        /// <param name="saveFilePath">下载后的保存路径</param>
        /// <param name="downloadFileName">文件名,相对路径</param>
        /// <param name="IsCreateIpath">是否要创建目录</param>
        public void DownloadSingleFile(string saveFilePath, string downloadFileName, bool IsCreateIpath)
        {
            if (IsCreateIpath)
            {
                saveFilePath += "\\" + downloadFileName;
                //判断目录是否存在,不存在就创建目录
                filesHelper.CreateDirectory(System.IO.Path.GetDirectoryName(saveFilePath));
            }
            else 
            {
                saveFilePath += "\\" + System.IO.Path.GetFileName(downloadFileName);
            }
            using (FileStream outputStream = new FileStream(saveFilePath, FileMode.Create))
            {
                response = FTPResponse(new Uri(ftpUrls + downloadFileName), WebRequestMethods.Ftp.DownloadFile);
                using (Stream ftpStream = response.GetResponseStream())
                {
                    long cl = response.ContentLength;
                    int bufferSize = 2048;
                    int readCount;
                    byte[] buffer = new byte[bufferSize];
                    readCount = ftpStream.Read(buffer, 0, bufferSize);
                    while (readCount > 0)
                    {
                        outputStream.Write(buffer, 0, readCount);
                        readCount = ftpStream.Read(buffer, 0, bufferSize);
                    }
                }
            }  
        }
        #endregion


        #region 批量下载当前目录下的所有文件与目录
        /// <summary>
        /// 批量下载当前目录下的所有文件与目录
        /// </summary>
        /// <param name="saveFilePath">下载后的保存路径</param>
        /// <param name="remoteDirectoryName">要下载的目录</param>
        /// <param name="IsDir">是否包含子目录</param>
        /// <param name="IsCreateIpath">是否创建子目录</param>
        public Tuple<OperationResult, List<FileStruct>> DownloadAllFile(string saveFilePath, string remoteDirectoryName, bool IsDir,bool IsCreateIpath)
        {
            fileLists = new List<FileStruct>();
            try
            {
                var listAll = getAllFilesAndDirectories(remoteDirectoryName,IsDir);
                if (listAll.Count > 0)
                {
                    foreach (var m in listAll)
                    {
                        if (!m.IsDirectory)
                        {
                            DownloadSingleFile(saveFilePath, m.Path, IsCreateIpath);
                        }
                    }
                }
                operationResult.isOk = true;
                operationResult.tRes = String.Format("下载当前目录{0}下的所有文件成功", remoteDirectoryName);
            }
            catch (Exception ex)
            {
                operationResult.isOk = false;
                operationResult.tRes = string.Format("下载当前目录{0}下的所有文件成功失败,失败原因:{1}", remoteDirectoryName, ex.ToString());
            }
            return new Tuple<OperationResult,List<FileStruct>>(operationResult, fileLists);
        }
        #endregion


        #region 单个文件上传
        /// <summary>
        /// 单个文件上传
        /// </summary>
        /// <param name="localFilePath">本地绝对路径</param>
        /// <param name="IsCreateIpath">是否创建目录</param>
        public void UploadSingleFile(string localFilePath,Uri ftpURI)
        {
            FileInfo fileInfo = new FileInfo(localFilePath);
            request = FTPRequest(new Uri(ftpURI + fileInfo.Name), WebRequestMethods.Ftp.UploadFile);
            request.ContentLength = fileInfo.Length;
            int buffLength = 2048;
            byte[] buff = new byte[buffLength];
            int contentLen;
            using (var fs = fileInfo.OpenRead())
            {
                using (var strm = request.GetRequestStream())
                {
                    contentLen = fs.Read(buff, 0, buffLength);
                    while (contentLen != 0)
                    {
                        strm.Write(buff, 0, contentLen);
                        contentLen = fs.Read(buff, 0, buffLength);
                    }
                }
            }
        }
        #endregion


        #region 批量上传当前目录下的所有文件
        /// <summary>
        /// 批量上传当前目录下的所有文件
        /// </summary>
        /// <param name="Ipath">Windows绝对路径</param>
        /// <param name="IsDir">是否包含子目录</param>
        /// <param name="IsCreateIpath">是否在Ftp上创建子目录</param>
        /// <returns></returns>
        public OperationResult UploadAllFile(string Ipath,bool IsDir,bool IsCreateIpath)
        {
            try
            {
                var data = filesHelper.GetDirectoryAndFile(Ipath, IsDir);
                if (data.Item1.isOk)
                {
                    foreach (var item in data.Item3.Values)
                    {
                        if (IsCreateIpath)
                        {
                            string fileRelationPath = System.IO.Path.GetDirectoryName(item).Substring(3).Replace("\\","/");
                            var data1 = CreateDirectory(fileRelationPath);
                            if (data1.isOk)
                            {
                                ftpURI = ftpUrls+ ftpRemotePath + "/" + fileRelationPath + "/";
                            }
                        }
                        UploadSingleFile(item, new Uri(ftpURI));
                    }
                }
                operationResult.isOk = true;
                operationResult.tRes = string.Format("批量上传当前目录{0}下的所有文件成功", Ipath);
            }
            catch (Exception ex) 
            {
                operationResult.isOk = false;
                operationResult.tRes = string.Format("批量上传当前目录{0}下的所有文件失败,失败原因{1}", Ipath,ex.ToString());
            }
            return operationResult;
        } 
        #endregion


        #region 递归获取FTP服务器上的目录和文件信息
        /// <summary>
        /// 递归获取FTP服务器上的目录和文件信息
        /// </summary>
        /// <param name="remoteDirectoryName">目录绝对路径</param>
        /// <param name="IsDir">是否获取子目录的文件</param>
        public List<FileStruct> getAllFilesAndDirectories(string remoteDirectoryName,bool IsDir)
        {
            try
            {
                GetListFilesAndDirectories(remoteDirectoryName,IsDir);
            }
            catch (Exception ex) 
            {
                return null;
            }
            return fileLists;
        }

        /// <summary>
        /// 获取当前目录下的文件和文件夹
        /// </summary>
        /// <param name="remoteDirectoryName">目录绝对路径</param>
        /// <param name="IsDir">是否要获取子文件夹的文件</param>
        public void GetListFilesAndDirectories(string remoteDirectoryName,bool IsDir)
        {
            GotoDirectory(remoteDirectoryName, true);
            var listAll = ListFilesAndDirectories();
            foreach (var m in listAll)
            {
                if (m.IsDirectory)
                {
                    if (IsDir)  //继续获取子文件夹
                    {
                        GetListFilesAndDirectories(m.Path,true);
                    } 
                }
                fileLists.Add(m);
            }
        } 
        #endregion


        #region 获取当前目录的一级子目录和文件信息
        /// <summary>
        /// 获取当前目录一级字目录和文件信息
        /// </summary>
        /// <param name="IsOnlyDir">是否只获取目录</param>
        /// <returns></returns>
        public List<FileStruct> ListFilesAndDirectories()
        {
            var fileList = new List<FileStruct>();
            response = FTPResponse(new Uri(ftpURI), WebRequestMethods.Ftp.ListDirectoryDetails);   
            using (var stream = response.GetResponseStream())
            {
                using (var sr = new StreamReader(stream))
                {
                    string line = null;
                    while ((line = sr.ReadLine()) != null)
                    {
                        DateTime dtDate = DateTime.ParseExact(line.Substring(0, 8), "MM-dd-yy", null);
                        DateTime dtDateTime = DateTime.Parse(dtDate.ToString("yyyy-MM-dd") + line.Substring(8, 9));
                        string[] arrs = line.Split(' ');
                        var model = new FileStruct()
                        {
                            IsDirectory = line.IndexOf("<DIR>") > 0 ? true : false,
                            CreateTime = dtDateTime,
                            Name = arrs[arrs.Length - 1],
                            Path = ftpRemotePath + "/" + arrs[arrs.Length - 1]
                        };
                        fileList.Add(model);
                    }
                }
            }
            return fileList;
        }
        #endregion
    }
  • 12
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值