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)
比赛组:
对于此特定列表,以下代码将执行:
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.ListDirectoryDetails FTP响应.
例如,使用WinSCP .NET程序集,您可以使用它Session.ListDirectory或Session.EnumerateRemoteFiles方法.
他们在内部使用该MLSD命令,但可以回退到LIST命令并支持许多不同的人类可读列表格式.
返回的列表显示为具有以下属性的RemoteFileInfo实例集合:
NameLastWriteTime (使用正确的时区)LengthFilePermissions (解析为个人权利)GroupOwnerIsDirectoryIsParentDirectoryIsThisDirectory(我是WinSCP的作者)
大多数其他第三方库也会这样做.使用FtpWebRequest该类对于此目的而言并不可靠.不幸的是,.NET框架中没有其他内置的FTP客户端.
| 归档时间: |
|
| 查看次数: |
17411 次 |
| 最近记录: |