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

简介: 转载:http://blog.csdn.net/gdjlc/article/details/11968477 using System; using System.Collections.Generic; using System.

转载: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

 

目录
相关文章
|
1月前
|
开发框架 .NET C#
C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式
【10月更文挑战第9天】在 C#/.NET Core 中,有多种方法可以删除字符串的最后一个字符,包括使用 `Substring` 方法、`Remove` 方法、`ToCharArray` 与 `Array.Copy`、`StringBuilder`、正则表达式、循环遍历字符数组以及使用 LINQ 的 `SkipLast` 方法。
|
2月前
|
存储 C# 索引
C# 一分钟浅谈:数组与集合类的基本操作
【9月更文挑战第1天】本文详细介绍了C#中数组和集合类的基本操作,包括创建、访问、遍历及常见问题的解决方法。数组适用于固定长度的数据存储,而集合类如`List<T>`则提供了动态扩展的能力。文章通过示例代码展示了如何处理索引越界、数组长度不可变及集合容量不足等问题,并提供了解决方案。掌握这些基础知识可使程序更加高效和清晰。
81 2
|
2月前
|
安全 C#
C# 面向对象编程的三大支柱:封装、继承与多态
【9月更文挑战第17天】在C#中,面向对象编程的三大支柱——封装、继承与多态,对于编写安全、可维护、可复用的代码至关重要。封装通过访问修饰符和属性保护数据;继承允许子类继承父类的属性和方法,实现代码复用和多态;多态则提高了代码的灵活性和通用性。掌握这三大概念能显著提升C#编程能力,优化开发效率和代码质量。
|
1月前
|
Java 程序员 C#
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
12 0
|
2月前
|
C# 数据安全/隐私保护
C# 一分钟浅谈:类与对象的概念理解
【9月更文挑战第2天】本文从零开始详细介绍了C#中的类与对象概念。类作为一种自定义数据类型,定义了对象的属性和方法;对象则是类的实例,拥有独立的状态。通过具体代码示例,如定义 `Person` 类及其实例化过程,帮助读者更好地理解和应用这两个核心概念。此外,还总结了常见的问题及解决方法,为编写高质量的面向对象程序奠定基础。
25 2
|
3月前
|
Java C# 索引
C# 面向对象编程(一)——类
C# 面向对象编程(一)——类
34 0
|
6月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
192 3
|
6月前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
198 3
|
14天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
29 3
|
1月前
|
安全 C# 数据安全/隐私保护
实现C#编程文件夹加锁保护
【10月更文挑战第16天】本文介绍了两种用 C# 实现文件夹保护的方法:一是通过设置文件系统权限,阻止普通用户访问;二是使用加密技术,对文件夹中的文件进行加密,防止未授权访问。提供了示例代码和使用方法,适用于不同安全需求的场景。
101 0