Ftp基础(四):C#连接使用Ftp(FluentFTP)

  作为一个.net开发这,说到C#连接使用Ftp,我就想到了很早之前的使用WebRequest来连接的方式,比如下载:  

    FtpWebRequest req = (FtpWebRequest)WebRequest.Create(new Uri("192.168.0.0:21/RootPath"));
    req.Credentials = new NetworkCredential("admin", "123456");
    req.KeepAlive = false;
    req.UseBinary = true;
    req.Method = WebRequestMethods.Ftp.DownloadFile;

    using (var stream = System.IO.File.OpenWrite("file"))
    {
        using (FtpWebResponse response = (FtpWebResponse)(await req.GetResponseAsync()))
        {
            Stream ftpStream = response.GetResponseStream();

            var buffer = new byte[81920];
            int count = await ftpStream.ReadAsync(buffer, 0, buffer.Length);
            while (count > 0)
            {
                await stream.WriteAsync(buffer, 0, count);
                count = await ftpStream.ReadAsync(buffer, 0, buffer.Length);
            }
            ftpStream.Close();
        }
    }

  现在应该不会有人还在这么用了吧,都2023-2024年了,这种用法早就过时了。

  而今天要说的连接Ftp的方式,就是使用FluentFTP包,我们可以使用Nuget安装

  

  简单使用

  FluentFTP的使用方式很简单,直接创建客户端对象使用就可以了,举几个例子:

  1、在40.0.0版本(不包含)之前,我只有一个FtpClient对象,它既可以同步操作也可以异步操作,一个简单的例子:

    //同步模式
    var ftpClient = new FtpClient("192.168.139.128", 21, "admin", "123456");
    //设置编码
    ftpClient.Encoding = Encoding.UTF8;
    //Ftp被动模式
    ftpClient.DataConnectionType = FtpDataConnectionType.AutoPassive;
    //开始连接
    ftpClient.Connect();
    //设置工作目录
    ftpClient.SetWorkingDirectory("FtpRoot");
    //上传
    ftpClient.UploadFile("localImage.jpg", "remoteImage.jpg");
    //下载
    ftpClient.DownloadFile("localImage.jpg", "remoteImage.jpg");

    //异步模式
    var ftpClient = new FtpClient("192.168.139.128", 21, "admin", "123456");
    //设置编码
    ftpClient.Encoding = Encoding.UTF8;
    //Ftp被动模式
    ftpClient.DataConnectionType = FtpDataConnectionType.AutoPassive;
    //开始连接
    await ftpClient.ConnectAsync();
    //设置工作目录
    await ftpClient.SetWorkingDirectoryAsync("FtpRoot");
    //上传
    await ftpClient.UploadFileAsync("localImage.jpg", "remoteImage.jpg");
    //下载
    await ftpClient.DownloadFileAsync("localImage.jpg", "remoteImage.jpg");

  2、从40.0.0版本开始,40.0.0版本及后续版本中,将FtpClient做了区分,原FtpClient只提供同步方式使用,增加了一个异步客户端AsyncFtpClient,同时将原来众多的设置项封装在了一个 FtpConfig对象中,还有其它的一些变动,总之与之前的版本相比变化还是挺大的,一个简单的例子:

    //同步模式
    var ftpClient = new FtpClient("192.168.139.128", "admin", "123456", 21);
    //设置编码
    ftpClient.Encoding = Encoding.UTF8;
    //Ftp被动模式
    ftpClient.Config.DataConnectionType = FtpDataConnectionType.AutoPassive;
    //开始连接
    ftpClient.Connect();
    //设置工作目录
    ftpClient.SetWorkingDirectory("FtpRoot");
    //上传
    ftpClient.UploadFile("localImage.jpg", "remoteImage.jpg");
    //下载
    ftpClient.DownloadFile("localImage.jpg", "remoteImage.jpg");

    //异步模式
    var ftpClient = new AsyncFtpClient("192.168.139.128", "admin", "123456", 21);
    //设置编码
    ftpClient.Encoding = Encoding.UTF8;
    //Ftp被动模式
    ftpClient.Config.DataConnectionType = FtpDataConnectionType.AutoPassive;
    //开始连接
    await ftpClient.Connect();
    //设置工作目录
    await ftpClient.SetWorkingDirectory("FtpRoot");
    //上传
    await ftpClient.UploadFile("localImage.jpg", "remoteImage.jpg");
    //下载
    await ftpClient.DownloadFile("localImage.jpg", "remoteImage.jpg");

  用法很简单吧,随便它怎么变,我们都会用就行,下面以最新版本(48.0.3)说说几个常用的方法和属性

  常用方法和属性 

  先说说属性吧,常用(或者常见)的属性有下面几个:  

    Host:Ftp地址
    Port:端口,默认21
    Credentials:认证信息,一般是用户账号和密码
    IsConnected:是否已建立连接,已建立连接可能未认证
    IsAuthenticated:是否已认证,建立在IsConnected之上
    Status:状态
    Encoding:编码,一般采用UTF-8
    ServerOS:系统环境
    ServerType:Ftp服务的类型,FluentFTP支持很多种Ftp服务器,可自定查看枚举类型
    Logger:日志记录,这个属性类型变量好几次,所以尽量不要使用吧,但是可以作为调试bug使用。
        曾经是Microsoft.Extensions.Logging.ILogger,现在是FluentFTP.IFtpLogger,在旧版本中,它只是一个委托字段(OnLogEvent)
    Config:配置对象,在旧版本中,它里面的属性是直接放在FtpClient类中的,常用的几个配置有:
        DataConnectionType:设置连接方式,一般主动模式建议用AutoActive,被动模式建议用AutoPassive
        UploadDataType:上传所使用的传输模式
        DownloadDataType:上传所使用的传输模式
        DownloadZeroByteFiles:0字节的文件是否需要被下载
        DownloadRateLimit:下载速度限制,0表示不限制,单位kb
        UploadRateLimit:上传熟读显示,0表示不限制,单位kb
        RetryAttempts:当上传或者下载失败是,重新尝试的次数
        TimeZone:Ftp服务器时区,比如北京市UTC+8,所以写8表示北京时间
        LocalTimeZone:本地时区,格式同TimeZone
        EncryptionMode:加密模式,一般采用Ftps会用到
        SslProtocols:加密协议,一般采用Ftps会用到
    IsEncrypted:表示当前是否在Ftps协议下使用
    ValidateCertificate:证书验证事件,一般采用Ftps会用到

  常用方法如下:

  1、上传

    UploadBytes:上传文件,文件格式是byte数组
    UploadDirectory:上传整个本地目录到服务器
    UploadFile:上传文件,文件格式是本地文件路径
    UploadFiles:上传多个本地文件到服务器指定目录
    UploadStream:上传文件,文件格式是流

  2、下载

    DownloadBytes:下载文件,内容保存在指定的byte数组中
    DownloadDirectory:下载远程目录至本地指定目录中
    DownloadFile:下载文件,并保存在指定文件中
    DownloadFiles:下载多个文件,并保存在指定目录下
    DownloadStream:下载文件,内容保存在指定流中

  3、其它文件操作

    CompareFile:本地与远程文件进行比较,默认不会下载文件,直接比较文件大小和校验hash散列值
    DeleteFile:删除远程文件
    FileExists:远程文件是否存在
    GetChecksum:获取远程文件的校验hash散列值
    GetFileSize:获取远程文件大小
    MoveFile:移动文件
    Rename:重命名文件,建议使用MoveFile代替

  4、目录操作

    CreateDirectory:创建目录
    DeleteDirectory:删除目录(及文件、子目录)
    DirectoryExists:目录是否已存在
    GetListing:获取指定目录(或者当前工作目录)下的所有文件及子目录
    GetWorkingDirectory:获取当前的工作目录
    SetWorkingDirectory:设置当前的工作目录
    IsRoot:当前工作目录是否是根目录
    MoveDirectory:移动远程目录到指定位置
    Rename:重命名,建议使用MoveDirectory代替
    EmptyDirectory:清空指定目录

  5、其它常用操作

    AutoDetect:自动发现FTP连接的设置并且返回这些连接的配置文件
    AutoConnect:自动发现FTP连接的设置并且使用第一个配置去连接服务器
    Chmod:授权,仅UNIX类型的系统有效,Windows下无效
    SetFilePermissions:同Chmod
    GetChmod:获取文件/目录的授权信息
    GetFilePermissions:同GetChmod,只是返回的结果是枚举类型
    Connect:开始连接
    Disconnect:断开连接

  

  结语

  这篇就写这么多吧,没什么好说的,应该都是些很简单的用法,参数看看名称应该也能理解吧,至于FluentFTP的一些高级用法,一般也用不上,感兴趣的可以自行了解下,比如,我们可以自己写上传的逻辑,而不是调用各种Upload方法,再比如,我们可以直接使用Ftp的各命令来操作。

 

posted @ 2023-11-26 15:54  没有星星的夏季  阅读(1494)  评论(6编辑  收藏  举报