FluentFTP中文翻译
请勿转载或者以任何形式的进行抄写!~
本文由博主自译,其中有部分内容属于博主个人理解,如果有错误请多多包涵!
翻译 by恋如雨止
如果想要Word版本的翻译文档请评论留下QQ注明要翻译文档,看到我都会给的!~
FluentFTP是提供给.NET和.NET Standard使用的,一个完全由托管的FTP和FTPS实现的经过速度优化的类库。它提供了全面的FTP的指令,功能包括文件上传/下载,SSL/TLS连接,自动目录清单列表解析,文件哈希/校验和,文件权限/CHMOD权限,FTP代理,UTF-8编码支持,Async/await支持,Powershell支持等等。
FluentFTP完全是由C#语言编写的,并且没有额外的依赖。它是在宽松的MIT许可下发布的,因此,FluentFTP既可以用于私有的应用程序,也可以用于自由/开源的应用程序。
如果你需要让一个特定的问题优先进行支持,可以考虑使用IssueHunt为处理这个问题提供资金资助。
稳定的二进制文件在NuGet上发布,包含在.NET/CLR应用程序中使用FTP/FTPS所需的所有内容。相关的用法,请参阅下面的示例用法的部分和文档的部分。
FluentFTP工作在.NET和.NET Standard/.NET Core。
平台
二进制文件夹
.NET 2.0
net20
.NET 3.5
net35
.NET 4.0
net40
.NET 4.5
net45
.NET Standard 1.4
netstandard1.4
.NET Standard 1.6
netstandard1.6
.NET Standard 2.0
Netstandard2.0
这些平台也支持FluentFTP:(通过.NET Standard)
所有平台的二进制文件都是由一个VS 2017项目来构建的。您需要使用VS 2017来构建或者修正FluentFTP。
你可以使用FluentFTP将文件从Powershell脚本传输到FTP服务器。开始:
在Powershell中运行以下命令可以打印出每个命令的帮助:
注:检查这些常见问题和已经解决的常见问题。
文件传输的常见问题
文件管理的常见问题
Misc的常见问题
一些非常常见的问题
常见问题
FtpClient类的全部的API文档都是用来处理所有的FTP/FTPS功能。
注:所有的方法都支持同步和异步的版本。只需在.NET 4.5+的版本中,为Async/await语的添加“Async”后缀,或者在.NET 4.0及以下版本的方法中添加“Begin”/“End”的前缀。
连接
服务器
目录清单
文件传输
高级API:
低级API:
文件管理
工作目录(相对的路径相对于当前的工作目录):
目录:
文件:
文件权限
大多数的服务器支持的标准命令
只支持安装并启用了CHMOD扩展的UNIX FTP服务器
文件哈希
(笔记:高级的文件传输API支持在上传/下载之后自动进行文件哈希)
大多数的服务器支持的标准命令
仅由某些服务器支持的非标准的命令。查看更多
工具
请导入FluentFTP来使用这些扩展方法,或者直接在FtpExtensions类中访问它们。
请直接访问FtpClient类下的这些静态方法。
日志
有关日志和调试的帮助,请参阅FAQ的条目。
仅.NET Standard可用
仅.NET Framework可用
设置
FTP设置
可以自动检测服务器上的FTP连接设置。
主动的FTP设置
FPTS设置
请在调用Connect()之前设置这些配置。可以自动地检测这些工作在你服务器上的FTPS连接设置。
文件清单列表设置
文件传输设置
超时设置
嵌套字(socket)设置
映射表记录了支持的FTP命令和相应的API..
连接指令
指令
API
描述
HOST
SendHost和SendHsotDomain
在共享主机上标识您的域
USER、PASS
Credentials
QUIT
Disconnect()
断开连接
PASV、EPSV、EPRT
DataConnectionType
被动和主动的FTP模式
FEAT
HasFeature()
获取服务器支持的特性
SYST
GetSystem()
获取服务器系统类型
OPTS UTF8 ON
Encoding
支持utf-8文件名
OPTS UTF8 OFF
Encoding,DisableUTF8()
禁用utf-8文件名
SUTH TLS
EncryptionMode
切换到TLS/FTPS
PBSZ、PROT
EncryptionMode和
DataConnectionEncryption
配置TLS/FTPS连接
CCC
PlainTextEncryption
切换到纯文本FTP
PRET
Automatic
预传输(Pre-transfer)文件信息
TYPE A
UploadDataType和
DownloadDataType
使用ASCII编码传输数据
TYPE I
UploadDataType和
DownloadDataType
使用二进制编码传输数据
文件管理命令
命令
API
描述
MLSD
GetListing()
获得目录的机器列表
LIST
获取目录文件列表
NLST
GetNameList()
获取目录名列表
LS
获取目录文件列表
STAT
获取目录文件列表
MLST
GetObjectInfo()
获得文件信息
DELE
DeleteFile()
删除一个文件
MKD
CreateDirectory()
创建一个目录
SITE MKDIR
CreateDirectory()
服务器端递归创建一个目录(ProFTPD)
RMD
DeleteDirectory()
删除一个目录
SIT RMDIR
DeleteDirectory()
服务器端递归删除一个目录(ProFTPD)
RMDA
DeleteDirectory()
服务器端递归删除一个目录(Serv-U)
CWD
SetWorkingDirectory()
改变工作目录
PWD
GetWorkingDirectory()
获得工作目录
SIZE
GetFileSize()
获得文件的字节大小
MDTM
GetModifiedTime()
GetObjectInfo()的dateModified
获得文件的修改日期
MFMT
SetModifiedTime()
修改文件的修改日期
SITE CHMOD
Chmod()或者SetFilePermissions()
修改文件的权限
RNFR、RNTO
Rename()
MoveFile()
重命名一个文件或一个目录
移动一个文件和一个目录
NOOP
Upload()
UploadFile()
Download()
DownloadFile()
在文件传输的时候保持活动状态
文件哈希命令
命令
API
描述
HASH
GetHash()
获取一个文件的哈希值
OPTS HASH
GetHashAlgorithm()/SetHashAlgorithm()
为哈希命令选择一个哈希算法
MD5
GetChecksum()或GetMD5()
获得一个文件的MD5哈希值
XMD5
GetChecksum()或GetXMD5()
获得一个文件的MD5哈希值
XSHA1
GetChecksum()或GetXSHA1()
获得一个文件的SHA-1哈希值
XSHA256
GetChecksum()或GetXSHA256()
获得一个文件的SHA-256哈希值
XSHA512
GetChecksum()或GetXSHA512()
获得一个文件的SHA-512哈希值
使用下面的代码:
一旦你找一个工作连接配置文件后,使用生成的代码快速连接到你的FTP服务器。
使用下面的代码:
使用下面的代码:
如果你连接到服务器有任何的问题,尝试使用其中之一:
防止操作系统使用在.NET Framework中有问题的TLS 1.0。
如果你在Linux上使用并且使用SSL/TLS连接失败,很可能是这个问题。
方法一:如果SSL证书没有错误则进行连接。
方法二:如果证书与白名单证书匹配,则连接。
首先,您必须发现有效证书的字符串。使用此代码将有效的证书字符串保存到文件中:
最后,使用这个代码检查收到的证书是否与您信任的证书匹配:
假设您在Azure应用程序服务实例上使用FTP发布服务。
如果您在连接Azure时遇到问题,请确保您没有“只使用FTPS”。根据Azure文档,“仅支持FTPS”不支持TLS 1.0和1.1,这可能会在试图将FluentFTP用于较旧版本的Windows时破坏连接。因此,当您试图连接到一个将会阻塞TLS 1.1的Azure FTP实例时,连接将静默地失败,因为它只接受TLS 1.2。
将设置更改为允许不安全的FTP之后,可以使用显式和隐式SSL模式连接FTPS。
当你有一个FTP防火墙需要使用初文明的FTP的时候这是非常有用的。我们使用CCC命令指示服务器恢复到FTP。
在调用FtpClient类上的Connect()或任何其他方法之前设置此选项。
不设置Credentials属性,我们可以用匿名的身份登录。或者您可以手动指定以下内容:
创建一个FtpClientHttpProxy或者FtpClientUserAtHostProxy的对象实例,然后按照往常一样使用FTP的属性和方法。
所有的高级的方法都提供了一个progress的参数,被使用来跟踪上传或者下载的进度。
在使用之前,先创建一个回调的方法来提供给上传/下载的方法。它将随着FtpProgress对象被调用,其中包含传输的百分比和各种统计数据。
如果你创建在你WinForm程序的UI中,可以创建一个Minimum = 0并且Maximum = 100的ProgressBar。
使用异步的API:
使用同步的API:
现在要调用上传/下载方法并提供您刚才创建的新的progress对象。
使用异步的方式:
使用同步的方式:
对于.NET 2.0的用户,通过IProgress类来实现。你传递的对象的Report()方法将会携带进度的值被调用。
使用Upload()来上传一个stream或者byte[]。
使用Download()将数据下载到一个stream或者byte[]中。
其他的配置:
使用一个新的API UploadFile():
设置UploadRateLimit和DownloadRateLimit属性来控制数据传输的速度。只有高级API才支持同步和异步版本,比如:
将FtpVerify选项设置添加到UploadFile()或DownloadFile()以启用自动校验和验证。
所有可能的配置:
使用API Upload():
使用基于流的API OpenAppend():
使用API OpenRead():
手动设置连接编码,以确保特殊字符正常工作。
默认你应该使用的代码页(codepage)是1252 Windows Western。它支持英语+欧洲字符(重音字符)。
以下是基于你需要的字符集的代码页的完整列表:
笔记:一些FTP服务器在列空文件夹的列表清单的时候不返回应答,所以客户端在另一端将没有与服务器沟通的套接字。这些异常在内部被捕获,并返回一个空的文件列表。如果你需要检查这个的捕获的实现,请在FluentFTP项目中搜索FtpMissingSocketException的所有实例。
在就版本的FluentFTP中,我们假定所有的服务器都支持通过List -R命令来递归列出文件的列表清单。然而,这导致了各种FTP服务器布置成递归列出清单的许多的问题:GetListing()调用将简单地返回第一个目录的内容,而不包含任何子目录。
因此,自从20.0.0版本,我们尝试去检查FTP服务器的软件,并且如果我们确定它不支持递归列表,我们将自己动手地进行递归。我们开始先假设所有服务器都不支持递归列表,然后将特定的服务器类型列入白名单。
如果您感觉GetListing()在使用递归列出列表清单的时候速度太慢,并且您知道您的FTP服务器支持LIST -R命令,然后请为您的服务器提供支持:
我们支持XCRC、XMD5和XSHA,它们是非标准命令,不包含任何形式的规范。它们不能保证工作,强烈建议您检查FtpClient。在调用这些方法之前,为各自的标志设置功能标志(XCRC、XMD5、XSHA1、XSHA256、XSHA512)。
对HASH命令的支持已经添加到FluentFTP中。它支持从支持这个功能的服务器上检索SHA-1、SHA-256、SHA-512和MD5散列。返回的FtpHash对象,它有一个具有针对给定流或本地文件检查结果的方法。你可以在这个草案中了解更多关于HASH的信息。
在程序启动时执行此操作(因为它是静态的,所以对所有FtpClient实例都有效)。
.NET Framework版本
.NET Standard版本
在程序启动时执行此操作(因为它是静态的,所以对所有FtpClient实例都有效)。
.NET Framework版本
.NET Standard版本
这是生产服务器的推荐配置。仅在.NET Framework版本中被支持。
在程序启动时执行此操作(因为它是静态的,所以对所有FtpClient实例都有效)。
在程序启动时执行此操作(因为它是静态的,所以对所有FtpClient实例都有效)。
使用这些设置来控制日志中包含哪些数据:
在代码中附加TraceListener:
通过配置文件附加:
EnableThreadSafeDataConnections是由最初的作者构建的一个较老的特性。如果为true,那么每当您试图上传/下载文件时,它都会打开一个新的FTP客户端实例(并重新连接到服务器)。它曾经是默认设置,但它严重影响了性能,所以我禁用了它,发现许多问题都得到了解决,性能也得到了恢复。我相信如果开发者想要多线程上传,他们应该启动一个新的BackgroundWorker并在该线程中创建/使用FtpClient。如果你想要并发上传,可以尝试一下。
首先你必须“fork”FluentFTP,然后对本地版本进行更改,当提交“pull request”请求让我合并你的变化。
您可以读取ServerType来获得您所连接的FTP服务器软件的确切类型。我们动态根据我们接连到服务器时服务器所发送的欢迎信息(the welcome message),来检测FTP服务器软件。我们目前可以检测如下软件类型:
您还可以读取ServerOS来获得所连接的FTP服务器的操作系统。我们可以检测如下系统到:
添加你的证书到ClientCertificates,然后再调用Connect()。
并确保:
您需要将证书添加到本地存储(local store),然后执行以下操作:
这是另外一种方式。使用X509Certificate2。我一直无法让X509Certificate证书工作,从我的查阅的资料来看,这是因为它是一个不完整的实现。
手动设置连接编码,以确保特殊字符正常工作。
默认你应该使用的代码页(codepage)是1252 Windows Western。它支持英语+欧洲字符(重音字符)。
手动设置连接编码,以确保特殊字符正常工作。
对于俄语,你需要使用代码页1251 Windows Cyrillic
首先尝试减少Azure需要的套接字轮询间隔。
如果这些都不起作用,请记住Azure有一个间歇性的bug,在这个bug中,它会在FTP请求期间更改ip地址。连接是使用IP地址A建立的,Azure使用IP地址B进行数据传输,这在很多防火墙上是不允许的。这是一个已知的Azure bug。
根据MSDN上所说的,Windows CE上的FTP实现是最少的,并通过源代码开放定制。许多高级命令如CHMOD都不受支持。
您需要在传输完文件之后调用FtpReply status = GetReply(),以确保没有遗留过时的数据,以免打乱后续命令。
FluentFTP在.NET Framework的底层使用SslStream。SslStream使用一个windows的特性功能来动态地更新Root CA证书,这可能会导致证书认证过程中的长时间延迟。这可能会在FluentFTP中引起与SocketPollInterval属性相关的问题,该属性用于检查客户机和服务器之间的不合理断开连接。这个MSDN博客讨论了SslStream的问题,并讨论了如何禁用Root CA证书的自动更新。
FluentFTP记录认证所需的时间。如果您认为自己正遭受这个问题的困扰,那么请查看Examples\ debug .cs以获取有关检索调试信息的信息。
这意味着服务器上的 [FTP守护进程(FTP daemon)] 服务没有运行(可能不是这种情况),或者服务当前仍然忙于执行另一个操作。这听起来就像服务器返回一条消息,表明它仍然在执行上一个操作。