基于C#的开源库FluentFTP全面介绍
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
前言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。
这些平台也支持FluentFTP:(通过.NET Standard)
所有平台的二进制文件都是由一个VS 2017项目来构建的。您需要使用VS 2017来构建或者修正FluentFTP。 使用例子//创建一个FTP客户端 FtpClient client = new FtpClient(“123.123.123.123”);
//如果您没有指定登录的凭证,我们将使用“匿名”用户账户 client.Credentials = new NetworkCredential(“david”,”pass123”);
//开始连接到服务器 client.Connect();
//获得一个在“/htdocs”目录下的文件和文件夹的列表 foreach(FtpListItem item in client.GetListing(“/htdocs”)){ //如果这个是一个文件 if(item.Type == FtpFileSystemObjectType.File){ //获得这个文件的大小 long size = client.GetFileSize(item.FullName); }
//获得文件或者文件夹的修改日期和时间 DateTime time = client.GetModifiedTime(item.FullName);
//计算文件在服务器端的哈希值(默认的算法) FtpHash hash = client.GetHash(item.FullName); }
//上传一个文件 client.UploadFile(@”C:\MyVideo.mp4”,”/htdocs/MyVideo.mp4”);
//重命名这个上传的文件 client.Rename(“/htdocs/MyVideo.mp4”,”/htdocs/MyVideo_2.mp4”);
//下载这个文件 client.DownloadFile(@”C:\MyVideo_2.mp4”,”/htdocs/MyVideo_2.mp4”);
//删除文件 client.deleteFile(“/htdocs/MyVideo_2.mp4”);
//递归地删除一个文件夹 client.deleteDirectory(“/htdocs/extras/”);
//检查文件是不是存在 if(client.FileExists(“/htdocs/big2.txt”)){}
//检查一个文件夹是不是存在 if(client.DirectoryExists(“/htdocs/extras/”)){}
//上传一个文件,并且如果失败,在失败之前会重新尝试三次 client.RetryAttempts=3;
client.UploadFile(@”C:\MyVideo.mp4”,”/htdocs/big.txt”,FtpExists.Overwrite,false,FtpVerify.Retry);
//断开连接!再见~ client.Disconnect(); Powershell你可以使用FluentFTP将文件从Powershell脚本传输到FTP服务器。开始:
>. C:\scripts\FluentFTP.ps1 #Makes functions callable from PowerShell scripts
> Show-FtpFile -Site ftp.mysite.com -User bob -Password secure -FtpDirectory pub -FtpFileName "text*" > Rename-File -Site ftp.mysite.com -User bob -Password secure -FtpDirectory pub -oldName "Readme.txt -newName Readme.done" > Send-FtpFile -Site ftp.mysite.com -User bob -Password secure -FtpDirectory pub -fileName "Read*" > Get-FtpFile -Site ftp.mysite.com -User bob -Password secure -FtpDirectory pub -ftpfileName "Read*" > Remove-FtpFile -Site ftp.mysite.com -User bob -Password secure -FtpDirectory pub -ftpfileName "Read*" 在Powershell中运行以下命令可以打印出每个命令的帮助: > get-help -full Show-FtpFile > get-help -full Rename-FtpFile > get-help -full Send-FtpFile > get-help -full Get-FtpFile > get-help -full Remove-FtpFile 文档
常见问题注:检查这些常见问题和已经解决的常见问题。 日志相关的常见问题
连接相关的常见问题
文件传输的常见问题
文件管理的常见问题
Misc的常见问题
一些非常常见的问题
常见问题
APIFtpClient类的全部的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支持映射表记录了支持的FTP命令和相应的API.. 连接指令
文件管理命令
文件哈希命令
常见问题如何自动检测正确的链接设置?使用下面的代码: FtpClient client = new FtpClient(hostname, username, password);//或者设置Host和Credentials var profiles = client.AutoDetect(); //如果找到任何配置文件,将代码打印到控制台 if(profiles.Count > 0){ var code = profiles[0].ToCode(); Console.WriteLine(code); } 一旦你找一个工作连接配置文件后,使用生成的代码快速连接到你的FTP服务器。 如何自动连接到FTP或FTPS服务器?使用下面的代码: FtpClient client = new FtpClient(hostname, username, password);//或者设置Host和Credentials client.AutoConnect(); 如何连接SSL/TLS?/如何使用FTPS?使用下面的代码: FtpClient client = new FtpClient(hostname, username, password);//或者设置Host和Credentials client.EncryptionMode = FtpEncryptionMode.Explicit; client.SslProtocols = SslProtocols.Tls; client.ValidateCertificate += new FtpSslValidation(OnValidateCertificate); client.Connect(); void OnValidateCertificate(FtpClient control, FtpSslValidationEventArgs e){ //在这里添加逻辑以测试证书是否有效 e.Accept = true; } 如果你连接到服务器有任何的问题,尝试使用其中之一: 让操作系统选择最高和最相关的TLS协议。 client.SslProtocols = Security.Authentication.SslProtocols.None; 防止操作系统使用在.NET Framework中有问题的TLS 1.0。 client.SslProtocols = SslProtocols.Default | SslProtocols.Tls11 | SslProtocols.Tls12; 如果你在Linux上使用并且使用SSL/TLS连接失败,很可能是这个问题。 如何在使用FTPS时验证服务器的证书?方法一:如果SSL证书没有错误则进行连接。 cleint.ValidanteCertificate += new FtpSslValidation(delegate (FtpClient c, FtpSslValidtionEventArgs e){ if(e.PolicyErrors != System.Net.Security.SslPolicyErrors.None) { e.Accept = false; } else { e.Accept = true; } }); 方法二:如果证书与白名单证书匹配,则连接。 首先,您必须发现有效证书的字符串。使用此代码将有效的证书字符串保存到文件中: cleint.ValidanteCertificate += new FtpSslValidation(delegate (FtpClient c, FtpSslValidtionEventArgs e){ File.WrtieAllText(@”c:\cert.txt”, e.Certificate.GetRawCertDataString()); }); 最后,使用这个代码检查收到的证书是否与您信任的证书匹配: string ValidCert = “<insert contents of cert.txt>”; cleint.ValidanteCertificate += new FtpSslValidation(delegate (FtpClient c, FtpSslValidtionEventArgs e){ if(e.PolicyErrors == SslPolicyErrors.None || e.Certificate.GetRawCertDataString() == ValidCert){ e.Accept = true; } else { Throw new Exception(“Invalid certificate : ” + e.PolicyErrors); } }); 如何使用SSL/TLS连接到Azure?假设您在Azure应用程序服务实例上使用FTP发布服务。 如果您在连接Azure时遇到问题,请确保您没有“只使用FTPS”。根据Azure文档,“仅支持FTPS”不支持TLS 1.0和1.1,这可能会在试图将FluentFTP用于较旧版本的Windows时破坏连接。因此,当您试图连接到一个将会阻塞TLS 1.1的Azure FTP实例时,连接将静默地失败,因为它只接受TLS 1.2。 将设置更改为允许不安全的FTP之后,可以使用显式和隐式SSL模式连接FTPS。 如何连接FTPS,然后切换回纯文本(Plaintext)的FTP?当你有一个FTP防火墙需要使用初文明的FTP的时候这是非常有用的。我们使用CCC命令指示服务器恢复到FTP。 在调用FtpClient类上的Connect()或任何其他方法之前设置此选项。 client.PlainTextEncryption = true; 如何连接SFTP?SFTP不被支持,因为它是SSH下的FTP,一个完全不一样的协议。请使用SSH.NET。 如何中使用匿名的FTP账户登录?/我在登录的时候遇到错误但是我可以在Firefox/Filezilla中正常登录不设置Credentials属性,我们可以用匿名的身份登录。或者您可以手动指定以下内容: client.Credentials = new NetworkCredential("anonymous", "anonymous"); 如何使用FTP代理登录?创建一个FtpClientHttpProxy或者FtpClientUserAtHostProxy的对象实例,然后按照往常一样使用FTP的属性和方法。 如何追踪文件的传输进度?所有的高级的方法都提供了一个progress的参数,被使用来跟踪上传或者下载的进度。 在使用之前,先创建一个回调的方法来提供给上传/下载的方法。它将随着FtpProgress对象被调用,其中包含传输的百分比和各种统计数据。 如果你创建在你WinForm程序的UI中,可以创建一个Minimum = 0并且Maximum = 100的ProgressBar。 使用异步的API: //接受一个FtpProgress对象的回调方法 Progress<FtpProgress> progress = new Progress<FtpProgress>(x => { //当进度未知的时候,会收到-1 if(x.Progress < 0) { progressBar.IsIndeterminate = true; } else { progressBar.IsIndeterminate = false; progressBar.Value = x; } }); 使用同步的API: //接受一个FtpProgress对象的回调方法 Action<FtpProgress> progress = new Action<FtpProgress>(x => { //当进度未知的时候,会收到-1 if(x.Progress < 0) { progressBar.IsIndeterminate = true; } else { progressBar.IsIndeterminate = false; progressBar.Value = x; } }); 现在要调用上传/下载方法并提供您刚才创建的新的progress对象。 使用异步的方式: await client.DownloadFileAsync(localPath, remotePath, FtpLocalExists.Overwrite, FluentFTP.FtpVerify.Retry, progress); 使用同步的方式: client.DownloadFile(localPath, remotePath, FtpLocalExists.Overwrite, FluentFTP.FtpVerify.Retry, progress); 对于.NET 2.0的用户,通过IProgress类来实现。你传递的对象的Report()方法将会携带进度的值被调用。 如何上传动态创建的数据?使用Upload()来上传一个stream或者byte[]。 如何下载数据而不将其保存到磁盘?使用Download()将数据下载到一个stream或者byte[]中。 如何继续下载一个文件?使用带有existsMode设置为FtpLocalExists.Append的DownloadFile()或者DownloadFiles()。 //通过比较文件大小和本地文件的大小,只下载文件中缺少的部分 client.DownloadFile(@”C:\MyVideo.mp4”, “/htdocs/MyVideo.mp4”, FtpLocalExists.Append); 其他的配置:
如何继续上传一个文件?使用一个新的API UploadFile(): //通过比较文件大小和本地文件的大小,只上传服务器文件中缺少的部分 client.UploadFile(@”C:\bigfile.iso”, “/htdocs/bigfile.iso”, FtpLocalExists.Append); 如何控制上传和下载的速度?设置UploadRateLimit和DownloadRateLimit属性来控制数据传输的速度。只有高级API才支持同步和异步版本,比如:
有关节流的最新改进,请参阅这篇文章。 如何验证文件的哈希值/校验和,如果校验和不匹配,如何重试?将FtpVerify选项设置添加到UploadFile()或DownloadFile()以启用自动校验和验证。 //上传文件的时候重新尝试设置为3次 client.RetryAttempts = 3; //上传一个文件,在放弃之前或尝试重传3次 client.UploadFile(@"C:\MyVideo.mp4", "/htdocs/MyVideo.mp4", FtpExists.Overwrite, false, FtpVerify.Retry); 所有可能的配置:
如何追加到一个文件?使用API Upload(): //将数据追加到一个已经存在的文件中 File.AppendAllText(@"C:\readme.txt", "text to be appended" + Environment.NewLine); //只有readme.txt的新部分将被写入服务器 client.UploadFile("C:\readme.txt", "/htdocs/readme.txt", FtpExists.Append); 使用基于流的API OpenAppend(): using (FtpClient conn = new FtpClient()) { conn.Host = "localhost"; conn.Credentials = new NetworkCredential("ftptest", "ftptest"); using (Stream ostream = conn.OpenAppend("/full/or/relative/path/to/file")) { try { ostream.Position = ostream.Length; var sr = new StreamWriter(ostream); sr.WriteLine(...); } finally { ostream.Close(); conn.GetReply(); //从服务器读取成功/失败响应 } } } 如何使用低级的(low-level)API下载文件?使用API OpenRead(): //创建远程FTP流和本地文件流 using (var remoteFileStream = client.OpenRead(remotePath, FtpDataType.Binary)){ using (var newFileStream = File.create(localPath)){ //一次读取8KB的数据(你可以增加数量) byte[] buffer = new byte[8 * 1024]; //下载文件到本地的流 int len; while ((len = remoteFileStream.Read(buffer, 0, buffer.Length)) > 0) { newFileStream.Write(buffer, 0, len); } } } //读取FTP响应并防止套接字上的过时数据 client.GetReply(); 如果我的服务器不支持UTF-8,如何上传/下载Unicode文件名的文件?手动设置连接编码,以确保特殊字符正常工作。 默认你应该使用的代码页(codepage)是1252 Windows Western。它支持英语+欧洲字符(重音字符)。 client.Encoding = System.Text.Encoding.GetEncoding(1252); //ANSI代码页1252(Windows Western) 以下是基于你需要的字符集的代码页的完整列表:
GetListing()如何在内部工作?
如果这些都不能满足你,你还可以退一步使用名称清单列表(NLST命令),它比LIST和MLSD命令要慢很多。这是因为NLST只发送文件名列表,没有任何属性。必须逐个文件地查询服务器的文件大小、修改日期和类型(文件/文件夹)。通过FtpListOption.ForceNameList标志,可以让名称清单列表可以被强制使用。 笔记:一些FTP服务器在列空文件夹的列表清单的时候不返回应答,所以客户端在另一端将没有与服务器沟通的套接字。这些异常在内部被捕获,并返回一个空的文件列表。如果你需要检查这个的捕获的实现,请在FluentFTP项目中搜索FtpMissingSocketException的所有实例。 GetListing()如何返回一个递归的文件列表?在就版本的FluentFTP中,我们假定所有的服务器都支持通过List -R命令来递归列出文件的列表清单。然而,这导致了各种FTP服务器布置成递归列出清单的许多的问题:GetListing()调用将简单地返回第一个目录的内容,而不包含任何子目录。 因此,自从20.0.0版本,我们尝试去检查FTP服务器的软件,并且如果我们确定它不支持递归列表,我们将自己动手地进行递归。我们开始先假设所有服务器都不支持递归列表,然后将特定的服务器类型列入白名单。 如果您感觉GetListing()在使用递归列出列表清单的时候速度太慢,并且您知道您的FTP服务器支持LIST -R命令,然后请为您的服务器提供支持:
支持哪种散列命令?我们支持XCRC、XMD5和XSHA,它们是非标准命令,不包含任何形式的规范。它们不能保证工作,强烈建议您检查FtpClient。在调用这些方法之前,为各自的标志设置功能标志(XCRC、XMD5、XSHA1、XSHA256、XSHA512)。 这里文章中描述的MD5命令支持也已经被添加。在执行命令之前,再次检查FtpFeature.MD5。 对HASH命令的支持已经添加到FluentFTP中。它支持从支持这个功能的服务器上检索SHA-1、SHA-256、SHA-512和MD5散列。返回的FtpHash对象,它有一个具有针对给定流或本地文件检查结果的方法。你可以在这个草案中了解更多关于HASH的信息。 如何在调试时追踪FTP命令?在程序启动时执行此操作(因为它是静态的,所以对所有FtpClient实例都有效)。 .NET Framework版本 FtpTrace.AddListener(new ConsoleTraceListener()); FtpTrace.LogUserName = false;//隐藏FTP用户名 FtpTrace.LogPassword = false;//隐藏FTP密码 FtpTrace.LogIP = false; //隐藏FTP的IP地址 .NET Standard版本 FtpTrace.LogToConsole = true; FtpTrace.LogUserName = false;//隐藏FTP用户名 FtpTrace.LogPassword = false;//隐藏FTP密码 FtpTrace.LogIP = false;//隐藏FTP的IP地址 如何在调试记录所有的FTP命令到文件中?在程序启动时执行此操作(因为它是静态的,所以对所有FtpClient实例都有效)。 .NET Framework版本 FtpTrace.AddListener(new TextWriterTraceListener("log_file.txt")); FtpTrace.LogUserName = false;//隐藏FTP用户名 FtpTrace.LogPassword = false;//隐藏FTP密码 FtpTrace.LogIP = false; //隐藏FTP的IP地址 .NET Standard版本 FtpTrace.LogToFile = “log_file.txt”; FtpTrace.LogUserName = false;//隐藏FTP用户名 FtpTrace.LogPassword = false;//隐藏FTP密码 FtpTrace.LogIP = false;//隐藏FTP的IP地址 如何将关键错误记录到文件中?这是生产服务器的推荐配置。仅在.NET Framework版本中被支持。 在程序启动时执行此操作(因为它是静态的,所以对所有FtpClient实例都有效)。 FtpTrace.LogFunctions = false; FtpTrace.AddListener(new TextWriterTraceListener("log_file.txt"){ Filter = new EventTypeFilter(SourceLevels.Error) }); 如何禁用函数调用的日志记录?在程序启动时执行此操作(因为它是静态的,所以对所有FtpClient实例都有效)。 FtpTrace.LogFunctions = false; 如何中日志中省略掉敏感的信息?使用这些设置来控制日志中包含哪些数据:
如何使用像NLog这样的第三方日志记录框架?FluentFTP有一个名为“FluentFTP”的内置TraceSource,可用于调试和日志记录。目前,除了.NET Standard之外,所有的.NET Framework版本都可以使用。通过写入到程序或者配置到你的app.config或者web.config都可以将实现任何的TraceListener附加到类库程序中。这将允许直接日志记录或转发到第三方日志记录框架。 大多数跟踪消息的类型为Verbose或Information,通常可以忽略,除非进行调试。大多数被忽略的异常被归类为Warning,但是返回布尔值表示成功/失败的方法,将以Error级别记录失败原因。如果您使用的是.NET Standard,并且设置了DEDUG标志,然后所有日志消息将通过Debug.Write(message)方式发出。 在代码中附加TraceListener: TraceListener console = ConsoleTraceListener() { Filter = new EventTypeFilter(SourceLevels.Verbose | SourceLevels.ActivityTracking) }; FtpTrace.AddListener(console); 通过配置文件附加: <system.diagnostics> <trace autoflush="true"></trace> <sources> <source name="FluentFTP"> <listeners> <clear /> <!--附加一个Console控制台监听器--> <add name="console" /> <!--附加一个File监听器--> <add name="file" /> <!--附加一个用户自定义的监听器--> <add name="myLogger" /> <!--附加一个NLog监听器--> <add name="nlog" /> </listeners> </source> </sources> <sharedListeners> <!--定义一个Console控制台监听器--> <add name="console" type="System.Diagnostics.ConsoleTraceListener" /> <!--定义一个File监听器 --> <add name="file" type="System.Diagnostics.TextWriterTraceListener" initializeData="outputFile.log"> <!--只写入错误--> <filter type="System.Diagnostics.EventTypeFilter" initializeData="Error" /> </add> <!--定义一个用户自定义的监听器--> <add name="custom" type="MyNamespace.MyCustomTraceListener /> <!--附加一个NLog监听器--> <add name="nlog" type="NLog.NLogTraceListener, NLog" /> </sharedListeners> </system.diagnostics> EnableThreadSafeDataConnections做什么?EnableThreadSafeDataConnections是由最初的作者构建的一个较老的特性。如果为true,那么每当您试图上传/下载文件时,它都会打开一个新的FTP客户端实例(并重新连接到服务器)。它曾经是默认设置,但它严重影响了性能,所以我禁用了它,发现许多问题都得到了解决,性能也得到了恢复。我相信如果开发者想要多线程上传,他们应该启动一个新的BackgroundWorker并在该线程中创建/使用FtpClient。如果你想要并发上传,可以尝试一下。 如何对FluentFTP做一些修改?/如何提交一个拉取请求(a pull reqest)?首先你必须“fork”FluentFTP,然后对本地版本进行更改,当提交“pull request”请求让我合并你的变化。
如何检测正在连接的服务器的类型?您可以读取ServerType来获得您所连接的FTP服务器软件的确切类型。我们动态根据我们接连到服务器时服务器所发送的欢迎信息(the welcome message),来检测FTP服务器软件。我们目前可以检测如下软件类型:
您还可以读取ServerOS来获得所连接的FTP服务器的操作系统。我们可以检测如下系统到:
如何使用客户端证书登入FTPS?添加你的证书到ClientCertificates,然后再调用Connect()。 client.EncryptionMode = FtpEncryptionMode.Explicit; client.SslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12; client.SocketKeepAlive = false; client.ClientCertificates.Add(new X509Certificate2("C:\mycert.cer")); client.ValidateCertificate += (control, e) => { e.Accept = e.PolicyErrors == SslPolicyErrors.None; }; client.Connect(); 并确保:
如何从一个文件捆绑X509证书?您需要将证书添加到本地存储(local store),然后执行以下操作: FluentFTP.FtpClient client = new FluentFTP.FtpClient("WWW.MYSITE.COM", "USER","PASS"); //选择证书并将它添加到客户端 X509Store store = new X509Store("MY", StoreLocation.LocalMachine); store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates; X509Certificate2Collection fcollection = (X509Certificate2Collection)collection.Find(X509FindType.FindByTimeValid, DateTime.Now, false); X509Certificate2Collection scollection = X509Certificate2UI.selectfromCollection(fcollection, "select a certificate", "select a certificate", X509selectionFlag.Multiselection); if (scollection.Count != 1) { throw new Exception("Error: You have not chosen exactly one certificate"); } foreach (X509Certificate2 x509 in scollection) { client.ClientCertificates.Add(x509); } store.Close(); //client.ReadTimeout = 10000; client.Connect(); 这是另外一种方式。使用X509Certificate2。我一直无法让X509Certificate证书工作,从我的查阅的资料来看,这是因为它是一个不完整的实现。 public void InitSFTP() { FluentFTP.FtpClient client = new FluentFTP.FtpClient("WWW.MYSITE.COM", "USER", "PASS"); X509Certificate2 cert_grt = new X509Certificate2("C:\mycert.xyz"); client.EncryptionMode = FtpEncryptionMode.Explicit; client.DataConnectionType = FtpDataConnectionType.PASV; client.DataConnectionEncryption = true; client.ClientCertificates.Add(cert_grt); client.ValidateCertificate += new FtpSslValidation(OnValidateCertificate); client.Connect(); } private void OnValidateCertificate(FtpClient control, FtpSslValidationEventArgs e) { e.Accept = true; } 解决问题在Visual Studio 2010中Fluent安装失败:“System.Runtime”已经为“FluentFTP”定义了一个依赖项你的VS使用了一个老版本的nuget.exe,所以它不能正确安装最新的FluentFTP。你必须下载nuget.exe 并手动执行下面这些命令: cd D:\Projects\MyProjectDir C:\Nuget\nuget.exe install FluentFTP 上传一个带有特殊字符的文件,像是“Caffè.png”,在FTP服务器上,它表现为“Caff?.png”。这个服务器只支持ASCII,但是这个“è”是ASCII。FileZilla可以上传这个文件,并且没有任何问题手动设置连接编码,以确保特殊字符正常工作。 默认你应该使用的代码页(codepage)是1252 Windows Western。它支持英语+欧洲字符(重音字符)。 client.Encoding = System.Text.Encoding.GetEncoding(1252); //ANSI代码页1252(Windows Western) 如何文件名中含有俄文字母,我无法删除这个文件。但是FileZilla可以删除这个文件,并且没有问题手动设置连接编码,以确保特殊字符正常工作。 对于俄语,你需要使用代码页1251 Windows Cyrillic client.Encoding = System.Text.Encoding.GetEncoding(1251); //ANSI代码页1251(Windows Cyrillic) 我总是在我的Azure WebApp中发生TimeoutException异常首先尝试减少Azure需要的套接字轮询间隔。 client.SocketPollInterval = 1000; 如果这也不管用,那么试着减少超时时间。 client.SocketPollInterval = 1000; client.ConnectTimeout = 2000; client.ReadTimeout = 2000; client.DataConnectionConnectTimeout = 2000; client.DataConnectionReadTimeout = 2000; 如果这些都不起作用,请记住Azure有一个间歇性的bug,在这个bug中,它会在FTP请求期间更改ip地址。连接是使用IP地址A建立的,Azure使用IP地址B进行数据传输,这在很多防火墙上是不允许的。这是一个已知的Azure bug。 许多的命令无法在Windows CE上正常工作根据MSDN上所说的,Windows CE上的FTP实现是最少的,并通过源代码开放定制。许多高级命令如CHMOD都不受支持。 使用OpenWrite/OpenAppend成功传输单个文件后,后续文件失败,出现一些随机错误,如“格式错误的PASV响应”您需要在传输完文件之后调用FtpReply status = GetReply(),以确保没有遗留过时的数据,以免打乱后续命令。 在FTPS的登入期间,SSL协商非常缓慢FluentFTP在.NET Framework的底层使用SslStream。SslStream使用一个windows的特性功能来动态地更新Root CA证书,这可能会导致证书认证过程中的长时间延迟。这可能会在FluentFTP中引起与SocketPollInterval属性相关的问题,该属性用于检查客户机和服务器之间的不合理断开连接。这个MSDN博客讨论了SslStream的问题,并讨论了如何禁用Root CA证书的自动更新。 FluentFTP记录认证所需的时间。如果您认为自己正遭受这个问题的困扰,那么请查看Examples\ debug .cs以获取有关检索调试信息的信息。 无法从传输连接读取数据:远程主机强制关闭了现有连接这意味着服务器上的 [FTP守护进程(FTP daemon)] 服务没有运行(可能不是这种情况),或者服务当前仍然忙于执行另一个操作。这听起来就像服务器返回一条消息,表明它仍然在执行上一个操作。 尝试减少轮询间隔以确保连接不会超时。 client.SocketPollInterval = 1000; 该文章在 2023/10/9 9:50:00 编辑过 |
关键字查询
相关文章
正在查询... |