当前位置: 移动技术网 > IT编程>开发语言>c# > 【C#】工具类-FTP操作封装类FTPHelper

【C#】工具类-FTP操作封装类FTPHelper

2020年01月10日  | 移动技术网IT编程  | 我要评论

c# ftphelper实现ftp服务器文件读写操作,支持ssl协议(ftp服务器为:serv-u10.0)。

using system;
using system.collections.generic;
using system.io;
using system.linq;
using system.net;
using system.net.security;
using system.security.cryptography.x509certificates;
using system.text;

namespace ftptest
{
    public class ftphelper
    {
        #region 变量
        /// <summary>
        /// ftp请求对象
        /// </summary>
        ftpwebrequest request = null;
        /// <summary>
        /// ftp响应对象
        /// </summary>
        ftpwebresponse response = null;

        /// <summary>
        /// ftp服务器长地址
        /// </summary>
        public string ftpuri { get; private set; }
        /// <summary>
        /// ftp服务器ip
        /// </summary>
        public string serverip { get; private set; }
        /// <summary>
        /// ftp端口
        /// </summary>
        public int serverport { get; private set; }
        /// <summary>
        /// ftp用户
        /// </summary>
        public string username { get; private set; }
        /// <summary>
        /// ftp密码
        /// </summary>
        public string password { get; private set; }
        /// <summary>
        /// 是否启用ssl
        /// </summary>
        public bool enablessl { get; private set; }
        #endregion

        #region 构造
        /// <summary>  
        /// 初始化
        /// </summary>  
        /// <param name="ftpserverip">ip</param> 
        /// <param name="ftpserverport">端口</param> 
        /// <param name="ftpuserid">用户名</param> 
        /// <param name="ftppassword">密码</param> 
        public ftphelper(string ftpserverip, int ftpserverport, string ftpusername, string ftppassword, bool ftpenablessl = false)
        {
            serverip = ftpserverip;
            serverport = ftpserverport;
            username = ftpusername;
            password = ftppassword;
            enablessl = ftpenablessl;
            ftpuri = string.format("ftp://{0}:{1}/", ftpserverip, ftpserverport);
        }
        ~ftphelper()
        {
            if (response != null)
            {
                response.close();
                response = null;
            }
            if (request != null)
            {
                request.abort();
                request = null;
            }
        }
        #endregion

        #region 方法
        /// <summary>
        /// 建立ftp链接,返回响应对象
        /// </summary>
        /// <param name="uri">ftp地址</param>
        /// <param name="ftpmethod">操作命令</param>
        private ftpwebresponse open(uri uri, string ftpmethod)
        {
            try
            {
                request = (ftpwebrequest)ftpwebrequest.create(uri);
                request.method = ftpmethod;
                request.usebinary = true;
                request.keepalive = false;
                request.usepassive = true;//被动模式
                request.enablessl = enablessl;
                request.credentials = new networkcredential(username, password);
                request.timeout = 30000;
                //首次连接ftp server时,会有一个证书分配过程。
                //根据验证过程,远程证书无效。
                servicepoint sp = request.servicepoint;
                servicepointmanager.servercertificatevalidationcallback = new remotecertificatevalidationcallback(validateservercertificate);
                return (ftpwebresponse)request.getresponse();
            }
            catch (exception ex)
            {
                return null;
            }
        }
        /// <summary>
        /// 建立ftp链接,返回请求对象
        /// </summary>
        /// <param name="uri">ftp地址</param>
        /// <param name="ftpmethod">操作命令</param>
        private ftpwebrequest openrequest(uri uri, string ftpmethod)
        {
            try
            {
                request = (ftpwebrequest)webrequest.create(uri);
                request.method = ftpmethod;
                request.usebinary = true;
                request.keepalive = false;
                request.usepassive = true;//被动模式
                request.enablessl = enablessl;
                request.credentials = new networkcredential(username, password);
                request.timeout = 30000;

                servicepoint sp = request.servicepoint;
                servicepointmanager.servercertificatevalidationcallback = new remotecertificatevalidationcallback(validateservercertificate);
                return request;
            }
            catch (exception ex)
            {
                return null;
            }
        }
        /// <summary>
        /// 证书验证回调
        /// </summary>
        private bool validateservercertificate(object sender, x509certificate certificate, x509chain chain, sslpolicyerrors sslpolicyerrors)
        {
            return true;
        }

        /// <summary>
        /// 下载文件
        /// </summary>
        /// <param name="remotefilename">远程文件</param>
        /// <param name="localfilename">本地文件</param>
        public bool get(string remotefilename, string localfilename)
        {
            response = open(new uri(ftpuri + remotefilename), webrequestmethods.ftp.downloadfile);
            if (response == null) return false;

            try
            {
                using (filestream outputstream = new filestream(localfilename, filemode.create))
                {
                    using (stream ftpstream = response.getresponsestream())
                    {
                        long length = 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);
                        }
                    }
                }
                return true;
            }
            catch
            {
                return false;
            }
        }
        /// <summary>
        /// 文件上传
        /// </summary>
        /// <param name="localfilename">本地文件</param>
        /// <param name="localfilename">远程文件</param>
        public bool put(string localfilename, string remotefilename)
        {
            fileinfo fi = new fileinfo(localfilename);
            if (fi.exists == false) return false;
            request = openrequest(new uri(ftpuri + remotefilename), webrequestmethods.ftp.uploadfile);
            if (request == null) return false;

            request.contentlength = fi.length;
            int bufflength = 2048;
            byte[] buff = new byte[bufflength];
            int contentlen;
            try
            {
                using (var fs = fi.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);
                        }
                    }
                }
                return true;
            }
            catch
            {
                return false;
            }
        }
        /// <summary>
        /// 删除文件
        /// </summary>
        public bool deletefile(string filename)
        {
            response = open(new uri(ftpuri + filename), webrequestmethods.ftp.deletefile);
            return response == null ? false : true;
        }

        /// <summary>
        /// 创建目录
        /// </summary>
        public bool createdirectory(string dirname)
        {
            response = open(new uri(ftpuri + dirname), webrequestmethods.ftp.makedirectory);
            return response == null ? false : true;
        }
        /// <summary>
        /// 删除目录(包括下面所有子目录和子文件)
        /// </summary>
        public bool deletedirectory(string dirname)
        {
            var listall = getdirectoryandfiles(dirname);
            if (listall == null) return false;

            foreach (var m in listall)
            {
                if (m.isdirectory)
                    deletedirectory(m.path);
                else
                    deletefile(m.path);
            }
            response = open(new uri(ftpuri + dirname), webrequestmethods.ftp.removedirectory);
            return response == null ? false : true;
        }

        /// <summary>
        /// 获取目录的文件和一级子目录信息
        /// </summary>
        public list<filestruct> getdirectoryandfiles(string dirname)
        {
            var filelist = new list<filestruct>();
            response = open(new uri(ftpuri + dirname), webrequestmethods.ftp.listdirectorydetails);
            if (response == null) return filelist;

            try
            {
                using (var stream = response.getresponsestream())
                {
                    using (var sr = new streamreader(stream, encoding.default))
                    {
                        string line = null;
                        while ((line = sr.readline()) != null)
                        {
                            //line的格式如下:serv-u(文件夹为第1位为d)
                            //drw-rw-rw-   1 user     group           0 jun 10  2019 bstatus
                            //-rw-rw-rw-   1 user     group         625 dec  7  2018 ftp文档.txt
                            string[] arr = line.split(' ');
                            if (arr.length < 12) continue;//remotepath不为空时,第1行返回值为:total 10715

                            var model = new filestruct()
                            {
                                isdirectory = line.substring(0, 3) == "drw" ? true : false,
                                name = arr[arr.length - 1],
                                path = dirname + "/" + arr[arr.length - 1]
                            };

                            if (model.name != "." && model.name != "..")//排除.和..
                            {
                                filelist.add(model);
                            }
                        }
                    }
                }
                return filelist;
            }
            catch
            {
                return filelist;
            }
        }
        /// <summary>
        /// 获取目录的文件
        /// </summary>
        public list<filestruct> getfiles(string dirname)
        {
            var filelist = new list<filestruct>();
            response = open(new uri(ftpuri + dirname), webrequestmethods.ftp.listdirectory);
            if (response == null) return filelist;

            try
            {
                using (var stream = response.getresponsestream())
                {
                    using (var sr = new streamreader(stream, encoding.default))
                    {
                        string line = null;
                        while ((line = sr.readline()) != null)
                        {
                            var model = new filestruct()
                            {
                                name = line,
                                path = dirname + "/" + line
                            };
                            filelist.add(model);
                        }
                    }
                }
                return filelist;
            }
            catch
            {
                return filelist;
            }
        }

        /// <summary>
        /// 获得远程文件大小
        /// </summary>
        public long getfilesize(string filename)
        {
            response = open(new uri(ftpuri + filename), webrequestmethods.ftp.getfilesize);
            return response == null ? -1 : response.contentlength;
        }
        /// <summary>
        /// 文件是否存在
        /// </summary>
        public bool fileexist(string filename)
        {
            long length = getfilesize(filename);
            return length == -1 ? false : true;
        }
        /// <summary>
        /// 目录是否存在
        /// </summary>
        public bool directoryexist(string dirname)
        {
            var list = getdirectoryandfiles(path.getdirectoryname(dirname));
            return list.count(m => m.isdirectory == true && m.name == dirname) > 0 ? true : false;
        }
        /// <summary>
        /// 更改目录或文件名
        /// </summary>
        /// <param name="oldname">老名称</param>
        /// <param name="newname">新名称</param>
        public bool rename(string oldname, string newname)
        {
            request = openrequest(new uri(ftpuri + oldname), webrequestmethods.ftp.rename);
            request.renameto = newname;
            try
            {
                response = (ftpwebresponse)request.getresponse();
                return response == null ? false : true;
            }
            catch
            {
                return false;
            }
        }
        #endregion
    }

    /// <summary>
    /// ftp文件类
    /// </summary>
    public class filestruct
    {
        /// <summary>
        /// 是否为目录
        /// </summary>
        public bool isdirectory { get; set; }
        /// <summary>
        /// 创建时间(ftp上无法获得时间)
        /// </summary>
        //public datetime createtime { get; set; }
        /// <summary>
        /// 文件或目录名称
        /// </summary>
        public string name { get; set; }
        /// <summary>
        /// 路径
        /// </summary>
        public string path { get; set; }
    }
}

ssl测试调用代码

var ftp = new ftphelper("192.168.0.36", 21, "test", "1", true);
var list = ftp.getfiles("");

任何地方如有纰漏,欢迎诸位道友指教。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网