LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C#类如何解析WebRequestMethods.Ftp.ListDirectoryDetails FTP响应?

admin
2021年7月9日 14:58 本文热度 4589

我正在创建一个服务来监视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#类,可以无缝地处理这些情况?

我只需要列出具有以下详细信息的目录的内容:文件/目录名称,上次更新或创建的时间戳。



使用Regex构建了一个简单的解决方案,使用捕获组解析每一行中的相关信息:

public static Regex FtpListDirectoryDetailsRegex = new Regex(@".*(?(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\s*(?[0-9]*)\s*(?([0-9]|:)*)\s*(?.*)", RegexOptions.Compiled | RegexOptions.IgnoreCase);

然后,可以通过以下方法从捕获组中提取值:

        string ftpResponse = "-r--r--r-- 1 ftp ftp              0 Nov 19 11:08 aaa.txt";
        Match match = FtpListDirectoryDetailsRegex.Match(ftpResponse);
        string month = match.Groups["month"].Value;
        string day = match.Groups["day"].Value;
        string yearTime = match.Groups["yearTime"].Value;
        string fileName = match.Groups["fileName"].Value;

有些不值得注意的事情是:

  • 这只适用于上面ftpResponse变量中描述的格式的目录响应。 在我的情况下,我很幸运,每次只能访问同一个FTP服务器,所以响应格式不太可能改变。
  • yearTime变量可以代表文件时间戳的年份或时间。 您将需要通过查找冒号的一个实例来手动解析:character将指示此捕获组包含一个时间而不是年份。

实际上试图解析ListDirectoryDetails不是正确的选择。

你希望使用支持现代MLSD命令的FTP客户端,该命令以RFC 3659中指定的机器可读格式返回目录列表。解析古代LIST命令返回的可读格式(由FtpWebRequest内部使用 应该使用ListDirectoryDetails方法作为最后的选择,当与不支持MLSD命令的过时的FTP服务器(如Microsoft IIS FTP服务器)交谈时。

例如对于WinSCP .NET程序集,可以使用其Session.ListDirectorySession.EnumerateRemoteFiles方法。

他们在内部使用MLSD命令,但可以回退到LIST命令并支持数十种不同的可读格式的列表格式。

返回的列表被显示为具有以下属性的RemoteFileInfo实例的集合:

  • Name
  • LastWriteTime(有正确的时区)
  • Length
  • FilePermissions(分析为个人权利)
  • Group
  • Owner
  • IsDirectory
  • IsParentDirectory
  • IsThisDirectory

大多数其他第三方库也会这样做。 为此,使用FtpWebRequest是不可靠的。 不幸的是,.NET框架中没有其他内置的FTP客户端。


该文章在 2021/7/9 15:03:26 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved