解析FtpWebRequest ListDirectoryDe​​tails行

zSy*_*sis 10 c# ftp parsing ftpwebrequest

我需要一些帮助来解析ListDirectoryDetailsC#中的响应.

我只需要以下字段.

  • 文件名/目录名
  • 创建日期
  • 和文件大小.

这是我跑步时的一些线条ListDirectoryDetails:

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
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Rya*_*rad 23

不确定你是否仍然需要这个,但这是我提出的解决方案:

Regex regex = new Regex ( @"^([d-])([rwxt-]{3}){3}\s+\d{1,}\s+.*?(\d{1,})\s+(\w+\s+\d{1,2}\s+(?:\d{4})?)(\d{1,2}:\d{2})?\s+(.+?)\s?$",
    RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace );
Run Code Online (Sandbox Code Playgroud)

比赛组:

  1. 对象类型:
    • d:目录
    • - :文件
  2. 数组[3]的权限(rwx-)
  3. 文件大小
  4. 上次修改日期
  5. 上次修改时间
  6. 文件/目录名称

  • 使用组:^(?<fileordir> [d - ])(?<attribs> [rwxt - ] {3}){3}\s +\d {1,}\s +.*?(?<filesize>\d {1,})\ S +(<日期>\W +\S +\d {1,2}\S +(:?\ d {4}))(<yearortime>\d {1,2}:?\ d {2})?\ s +(?<filename>.+?)\ s?$如果年份相同,则显示时间,否则显示年份.那是设计上的.如果您需要准确的时间戳,请使用WebRequestMethods.Ftp.GetDateTimestamp. (2认同)
  • 哎呀,当然应该是"HH:mm".无论如何,我的最终改编的正则表达式是`@"^([d - ])((?:[rwxt - ] {3}){3})\ s +\d {1,}\s +.*?(\ d { 1,})\ S +(\ W +)\ S +(\ d {1,2})\ S +(\ d {4})(\ d {1,2}:?\ d {2})\ S +( .+?)\ S $?"` (2认同)

Mar*_*ryl 8

对于此特定列表,以下代码将执行:

FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/");
request.Credentials = new NetworkCredential("user", "password");
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
StreamReader reader = new StreamReader(request.GetResponse().GetResponseStream());

string pattern =
    @"^([\w-]+)\s+(\d+)\s+(\w+)\s+(\w+)\s+(\d+)\s+" +
    @"(\w+\s+\d+\s+\d+|\w+\s+\d+\s+\d+:\d+)\s+(.+)$";
Regex regex = new Regex(pattern);
IFormatProvider culture = CultureInfo.GetCultureInfo("en-us");
string[] hourMinFormats =
    new[] { "MMM dd HH:mm", "MMM dd H:mm", "MMM d HH:mm", "MMM d H:mm" };
string[] yearFormats =
    new[] { "MMM dd yyyy", "MMM d yyyy" };

while (!reader.EndOfStream)
{
    string line = reader.ReadLine();
    Match match = regex.Match(line);
    string permissions = match.Groups[1].Value;
    int inode = int.Parse(match.Groups[2].Value, culture);
    string owner = match.Groups[3].Value;
    string group = match.Groups[4].Value;
    long size = long.Parse(match.Groups[5].Value, culture);
    DateTime modified;
    string s = Regex.Replace(match.Groups[6].Value, @"\s+", " ");
    if (s.IndexOf(':') >= 0)
    {
        modified = DateTime.ParseExact(s, hourMinFormats, culture, DateTimeStyles.None);
    }
    else
    {
        modified = DateTime.ParseExact(s, yearFormats, culture, DateTimeStyles.None);
    }
    string name = match.Groups[7].Value;

    Console.WriteLine(
        "{0,-16} permissions = {1}  size = {2, 9}  modified = {3}",
        name, permissions, size, modified.ToString("yyyy-MM-dd HH:mm"));
}
Run Code Online (Sandbox Code Playgroud)

你会得到(截至2016年):

bin              permissions = d--x--x--x  size =      4096  modified = 2002-03-07 00:00
TEST.TXT         permissions = -rw-r--r--  size =    659450  modified = 2016-06-15 05:07
TEST03-05.TXT    permissions = -rw-r--r--  size = 101786380  modified = 2008-09-08 00:00
dropoff          permissions = drwxrwxr-x  size =      4096  modified = 2016-05-06 12:24
Run Code Online (Sandbox Code Playgroud)

但是,实际上试图解析返回的列表ListDirectoryDetails并不是正确的方法.

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

许多服务器使用不同的格式进行LIST命令响应.特别是IIS可以使用DOS格式.请参阅C#类以解析WebRequestMethods.Ftp.ListDirectoryDe​​tails FTP响应.


例如,使用WinSCP .NET程序集,您可以使用它Session.ListDirectorySession.EnumerateRemoteFiles方法.

他们在内部使用该MLSD命令,但可以回退到LIST命令并支持许多不同的人类可读列表格式.

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

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

(我是WinSCP的作者)


大多数其他第三方库也会这样做.使用FtpWebRequest该类对于此目的而言并不可靠.不幸的是,.NET框架中没有其他内置的FTP客户端.