C#的一個FTP操作封裝類FTPHelper

xwyd 9年前發布 | 1K 次閱讀 C#

    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; }  
}  </pre> 


 本文由用戶 xwyd 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!