我正在创建一个服务来监视FTP位置是否有新的更新,并且需要能够使用WebRequestMethods.Ftp.ListDirectoryDetails
方法解析FtpWebRequest
响应返回的响应。如果所有的响应都遵循相同的格式,这将是相当容易的,但不同的FTP服务器软件提供不同的响应格式。
例如,可能会返回:
08-10-11 12:02PM <DIR> Version2
06-25-09 02:41PM 144700153 image34.gif
06-25-09 02:51PM 144700153 updates.txt
11-04-10 02:45PM 144700214 digger.tif
另一台服务器可能会返回:
d--x--x--x 2 ftp ftp 4096 Mar 07 2002 bin
-rw-r--r-- 1 ftp ftp 659450 Jun 15 05:07 TEST.TXT
-rw-r--r-- 1 ftp ftp 101786380 Sep 08 2008 TEST03-05.TXT
drwxrwxr-x 2 ftp ftp 4096 May 06 12:24 dropoff
其他的差异也被观察到了,所以可能还有很多我还没有遇到的微妙差异。
有没有人知道一个完全托管的(在Windows上不需要访问外部dll)C#类可以无缝地处理这些情况?
我只需要列出一个目录的内容,详细说明如下:文件/目录名称、上次更新或创建的时间戳、文件/目录名称。
提前感谢您的任何建议,加文
4条答案
按热度按时间k97glaaz1#
对于第一个(DOS/Windows)列表,此代码将执行:
您将获得:
对于另一个(*nix)清单,请参阅我对Parsing FtpWebRequest ListDirectoryDetails行的回答。
但是,实际上尝试解析
ListDirectoryDetails
返回的清单并不是正确的方法。您希望使用支持现代
MLSD
命令的FTP客户端,该命令以RFC 3659中指定的机器可读格式返回目录列表。当与不支持MLSD
命令的过时FTP服务器(如Microsoft IIS FTP服务器)通信时,应将解析旧LIST
命令(由FtpWebRequest
内部用于其ListDirectoryDetails
方法)返回的人类可读格式用作最后的选择。例如,对于WinSCP .NET assembly,您可以使用其
Session.ListDirectory
或Session.EnumerateRemoteFiles
方法。它们在内部使用
MLSD
命令,但可以回退到LIST
命令,并支持几十种不同的人类可读的列表格式。返回的列表显示为
RemoteFileInfo
instances的集合,属性如下:Name
LastWriteTime
(带正确时区)Length
FilePermissions
(解析为单个权限)Group
Owner
IsDirectory
IsParentDirectory
IsThisDirectory
大多数其他第三方库也会这样做。使用
FtpWebRequest
class并不可靠。不幸的是,在.NET框架中没有其他内置的FTP客户端。w6mmgewl2#
我也面临着同样的问题,并使用Regex构建了一个简单的(尽管不是很健壮)解决方案,使用捕获组从每行中解析出相关信息:
然后,您可以通过以下方式从捕获组中提取值:
有些事情不注意的是:
ftpResponse
变量中找到的所描述的格式的目录响应起作用。在我的情况下,我很幸运,每次只访问同一个FTP服务器,所以响应格式不太可能改变。yearTime
变量可以表示文件时间戳的年份或时间。您需要通过查找冒号的示例来手动解析它:一个字符,指示此捕获组包含时间而不是年份yuvru6vn3#
我遇到的一个解决方案是EdtFTPnet
EdtFTPnet似乎是一个功能丰富的解决方案,可以处理许多不同的FTP选项,因此是理想的。
这是一个免费的开源解决方案,我已经为http://www.ftp2rss.com(一个我自己需要的小工具,但认为对其他人也可能有用)使用了它。
5ktev3wc4#
看看Ftp.dll FTP client。
它包括适用于Windows、Unix和Netware平台上的大多数FTP服务器的automatic directory listing parser。
请注意,这是我开发的商业产品。