对于此特定列表,以下代码将执行:
var request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/");
request.Credentials = new NetworkCredential("user", "password");
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
var 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);
string s = Regex.Replace(match.Groups[6].Value, @"\s+", " ");
string[] formats = (s.IndexOf(':') >= 0) ? hourMinFormats : yearFormats;
var modified = DateTime.ParseExact(s, formats, 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"));
}
您将获得(截至 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
但是,实际上尝试解析返回的列表ListDirectoryDetails
并不是正确的方法。
您希望使用支持现代命令的 FTP 客户端,该命令以RFC 3659MLSD
中指定的机器可读格式返回目录列表。在与不支持该命令的过时 FTP 服务器(如 Microsoft IIS FTP 服务器)通信时,解析由古老命令返回的人类可读格式(由for 其方法内部使用)应作为最后的选择.LIST
FtpWebRequest
ListDirectoryDetails
MLSD
LIST
许多服务器对命令响应使用不同的格式。特别是 IIS 可以使用 DOS 格式。请参阅C# 类以解析 WebRequestMethods.Ftp.ListDirectoryDetails FTP 响应。
例如,使用WinSCP .NET 程序集,您可以使用它的Session.ListDirectory
或Session.EnumerateRemoteFiles
方法。
他们在内部使用该MLSD
命令,但可以回退到该LIST
命令并支持数十种不同的人类可读列表格式。
返回的列表显示为具有以下属性的RemoteFileInfo
实例集合:
Name
LastWriteTime
(使用正确的时区)
Length
FilePermissions
(解析为个人权利)
Group
Owner
IsDirectory
IsParentDirectory
IsThisDirectory
(我是WinSCP的作者)
大多数其他 3rd 方库也会这样做。为此目的使用FtpWebRequest
该类是不可靠的。不幸的是,.NET 框架中没有其他内置的 FTP 客户端。