Для этого конкретного списка подойдет следующий код:
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"));
}
Вы получите (по состоянию на 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-клиент, который поддерживает современную команду MLSD
, которая возвращает список каталогов в машиночитаемом формате, указанном в RFC 3659 . Анализ читабельного человеком формата, возвращаемого древней командой LIST
(используемой внутри FtpWebRequest
для ее метода ListDirectoryDetails
), следует использовать в качестве крайней меры при обращении к устаревшим FTP-серверам, которые не поддерживают MLSD
(например, FTP-сервер Microsoft IIS).
Многие серверы используют другой формат ответа 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)
Большинство других сторонних библиотек будут делать то же самое. Использование FtpWebRequest
класса не является надежным для этой цели. К сожалению, в .NET Framework нет другого встроенного FTP-клиента.