首页 > 代码库 > 【C#】工具类-FTP操作封装类FTPHelper

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

转载:http://blog.csdn.net/gdjlc/article/details/11968477

技术分享
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.IO;public class FTPHelper{    /// <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 ftpServerIP { get; private set; }    /// <summary>    /// FTP服务器默认目录    /// </summary>    public string ftpRemotePath { get; private set; }    /// <summary>    /// FTP服务器登录用户名    /// </summary>    public string ftpUserID { get; private set; }    /// <summary>    /// FTP服务器登录密码    /// </summary>    public string ftpPassword { get; private set; }    /// <summary>      /// 初始化    /// </summary>      /// <param name="FtpServerIP">FTP连接地址</param>      /// <param name="FtpRemotePath">指定FTP连接成功后的当前目录, 如果不指定即默认为根目录</param>      /// <param name="FtpUserID">用户名</param>      /// <param name="FtpPassword">密码</param>      public FTPHelper(string ftpServerIP, string ftpRemotePath, string ftpUserID, string ftpPassword)    {        this.ftpServerIP = ftpServerIP;        this.ftpRemotePath = ftpRemotePath;        this.ftpUserID = ftpUserID;        this.ftpPassword = ftpPassword;        this.ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";    }    ~FTPHelper()    {        if (response != null)        {            response.Close();            response = null;        }        if (request != null)        {            request.Abort();            request = null;        }    }    /// <summary>    /// 建立FTP链接,返回响应对象    /// </summary>    /// <param name="uri">FTP地址</param>    /// <param name="ftpMethod">操作命令</param>    /// <returns></returns>    private FtpWebResponse Open(Uri uri, string ftpMethod)    {        request = (FtpWebRequest)FtpWebRequest.Create(uri);        request.Method = ftpMethod;        request.UseBinary = true;        request.KeepAlive = false;        request.Credentials = new NetworkCredential(this.ftpUserID, this.ftpPassword);        return (FtpWebResponse)request.GetResponse();    }    /// <summary>           /// 建立FTP链接,返回请求对象           /// </summary>          /// <param name="uri">FTP地址</param>           /// <param name="ftpMethod">操作命令</param>           private FtpWebRequest OpenRequest(Uri uri, string ftpMethod)    {        request = (FtpWebRequest)WebRequest.Create(uri);        request.Method = ftpMethod;        request.UseBinary = true;        request.KeepAlive = false;        request.Credentials = new NetworkCredential(this.ftpUserID, this.ftpPassword);        return request;    }    /// <summary>    /// 创建目录    /// </summary>    /// <param name="remoteDirectoryName">目录名</param>    public void CreateDirectory(string remoteDirectoryName)    {        response = Open(new Uri(ftpURI + remoteDirectoryName), WebRequestMethods.Ftp.MakeDirectory);    }    /// <summary>    /// 更改目录或文件名    /// </summary>    /// <param name="currentName">当前名称</param>    /// <param name="newName">修改后新名称</param>    public void ReName(string currentName, string newName)    {        request = OpenRequest(new Uri(ftpURI + currentName), WebRequestMethods.Ftp.Rename);        request.RenameTo = newName;        response = (FtpWebResponse)request.GetResponse();    }       /// <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 + "/" + ftpRemotePath + "/";    }           /// <summary>    /// 删除目录(包括下面所有子目录和子文件)    /// </summary>    /// <param name="remoteDirectoryName">要删除的带路径目录名:如web/test</param>    /*     * 例:删除test目录     FTPHelper helper = new FTPHelper("x.x.x.x", "web", "user", "password");                       helper.RemoveDirectory("web/test");     */    public void RemoveDirectory(string remoteDirectoryName)    {        GotoDirectory(remoteDirectoryName, true);        var listAll = ListFilesAndDirectories();        foreach (var m in listAll)        {            if (m.IsDirectory)                           RemoveDirectory(m.Path);                       else                           DeleteFile(m.Name);                   }        GotoDirectory(remoteDirectoryName, true);        response = Open(new Uri(ftpURI), WebRequestMethods.Ftp.RemoveDirectory);    }    /// <summary>    /// 文件上传    /// </summary>    /// <param name="localFilePath">本地文件路径</param>    public void Upload(string localFilePath)    {        FileInfo fileInf = new FileInfo(localFilePath);        request = OpenRequest(new Uri(ftpURI + fileInf.Name), WebRequestMethods.Ftp.UploadFile);        request.ContentLength = fileInf.Length;        int buffLength = 2048;        byte[] buff = new byte[buffLength];        int contentLen;        using (var fs = fileInf.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);                }            }        }    }    /// <summary>      /// 删除文件      /// </summary>      /// <param name="remoteFileName">要删除的文件名</param>    public void DeleteFile(string remoteFileName)    {        response = Open(new Uri(ftpURI + remoteFileName), WebRequestMethods.Ftp.DeleteFile);    }    /// <summary>    /// 获取当前目录的文件和一级子目录信息    /// </summary>    /// <returns></returns>    public List<FileStruct> ListFilesAndDirectories()    {        var fileList = new List<FileStruct>();        response = Open(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)                {                    //line的格式如下:                    //08-18-13  11:05PM       <DIR>          aspnet_client                    //09-22-13  11:39PM                 2946 Default.aspx                    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;    }    /// <summary>           /// 列出当前目录的所有文件           /// </summary>           public List<FileStruct> ListFiles()    {        var listAll = ListFilesAndDirectories();        var listFile = listAll.Where(m => m.IsDirectory == false).ToList();        return listFile;    }    /// <summary>           /// 列出当前目录的所有一级子目录           /// </summary>           public List<FileStruct> ListDirectories()    {        var listAll = ListFilesAndDirectories();        var listFile = listAll.Where(m => m.IsDirectory == true).ToList();        return listFile;    }    /// <summary>           /// 判断当前目录下指定的子目录或文件是否存在           /// </summary>           /// <param name="remoteName">指定的目录或文件名</param>          public bool IsExist(string remoteName)    {        var list = ListFilesAndDirectories();        if (list.Count(m => m.Name == remoteName) > 0)            return true;        return false;    }    /// <summary>           /// 判断当前目录下指定的一级子目录是否存在           /// </summary>           /// <param name="RemoteDirectoryName">指定的目录名</param>          public bool IsDirectoryExist(string remoteDirectoryName)    {        var listDir = ListDirectories();        if (listDir.Count(m => m.Name == remoteDirectoryName) > 0)            return true;        return false;    }    /// <summary>           /// 判断当前目录下指定的子文件是否存在          /// </summary>           /// <param name="RemoteFileName">远程文件名</param>           public bool IsFileExist(string remoteFileName)    {        var listFile = ListFiles();        if (listFile.Count(m => m.Name == remoteFileName) > 0)            return true;        return false;    }    /// <summary>    /// 下载    /// </summary>    /// <param name="saveFilePath">下载后的保存路径</param>    /// <param name="downloadFileName">要下载的文件名</param>    public void Download(string saveFilePath, string downloadFileName)    {        using (FileStream outputStream = new FileStream(saveFilePath + "\\" + downloadFileName, FileMode.Create))        {            response = Open(new Uri(ftpURI + 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);                }            }        }    }   }public class FileStruct{    /// <summary>    /// 是否为目录    /// </summary>    public bool IsDirectory { get; set; }    /// <summary>    /// 创建时间    /// </summary>    public DateTime CreateTime { get; set; }    /// <summary>    /// 文件或目录名称    /// </summary>    public string Name { get; set; }    /// <summary>    /// 路径    /// </summary>    public string Path { get; set; }}
View Code

开源.NET FTP组件edtFTPnet 用法

http://www.cnblogs.com/gdjlc/p/3341000.html

 

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