Для первого (DOS / Windows) перечисления этот код будет делать:
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 = @"^(\d+-\d+-\d+\s+\d+:\d+(?:AM|PM))\s+(<DIR>|\d+)\s+(.+)$";
Regex regex = new Regex(pattern);
IFormatProvider culture = CultureInfo.GetCultureInfo("en-us");
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
Match match = regex.Match(line);
DateTime modified =
DateTime.ParseExact(
match.Groups[1].Value, "MM-dd-yy hh:mmtt", culture, DateTimeStyles.None);
long size = (match.Groups[2].Value != "<DIR>") ? long.Parse(match.Groups[2].Value) : 0;
string name = match.Groups[3].Value;
Console.WriteLine(
"{0,-16} size = {1,9} modified = {2}",
name, size, modified.ToString("yyyy-MM-dd HH:mm"));
}
Вы получите:
Version2 size = 0 modified = 2011-08-10 12:02
image34.gif size = 144700153 modified = 2009-06-25 14:41
updates.txt size = 144700153 modified = 2009-06-25 14:51
digger.tif size = 144700214 modified = 2010-11-04 14:45
О другом (* nix) листинге см. мой ответ на разбор строки FtpWebRequest ListDirectoryDetails .
Но на самом деле попытка разобрать список, возвращаемый ListDirectoryDetails
, не является правильным способом.
Вы хотите использовать FTP-клиент, который поддерживает современную команду MLSD
, которая возвращает список каталогов в машиночитаемом формате, указанном в RFC 3659 . Анализ читабельного человеком формата, возвращаемого древней командой LIST
(используемой внутри FtpWebRequest
для ее метода ListDirectoryDetails
), следует использовать в качестве крайней возможности при обращении к устаревшим FTP-серверам, которые не поддерживают MLSD
(например, FTP-сервер Microsoft IIS).
Например, WinSCP .NET сборка , вы можете использовать методы Session.ListDirectory
или Session.EnumerateRemoteFiles
.
Они внутренне используют команду MLSD
, но могут использовать команду LIST
и поддерживают десятки различных читабельных форматов списков.
Возвращенный список представлен как коллекция RemoteFileInfo
экземпляров со свойствами, такими как:
Name
LastWriteTime
(с правильным часовым поясом)
Length
FilePermissions
(разбито на индивидуальные права)
Group
Owner
IsDirectory
IsParentDirectory
IsThisDirectory
(я автор WinSCP)
Большинство других сторонних библиотек будут делать то же самое. Использование FtpWebRequest
класса не является надежным для этой цели. К сожалению, в .NET Framework нет другого встроенного FTP-клиента.