この特定のリストの場合、次のコードで実行できます。
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
は、正しい方法ではありません。
RFC3659MLSD
で指定された機械可読形式でディレクトリリストを返す最新のコマンドをサポートするFTPクライアントを使用したいとします。コマンドをサポートしていない廃止されたFTPサーバー(Microsoft IIS FTPサーバーなど)と通信する場合は、古いコマンドによって返される人間が読める形式(そのメソッドのために内部的に使用される)を解析することを最後の手段として使用する必要があります。 。LIST
FtpWebRequest
ListDirectoryDetails
MLSD
LIST
多くのサーバーは、コマンド応答に異なる形式を使用します。特にIISはDOS形式を使用できます。WebRequestMethods.Ftp.ListDirectoryDetails FTP応答を解析するには、C#クラスを参照してください。
たとえば、WinSCP .NETアセンブリでは、そのSession.ListDirectory
またはSession.EnumerateRemoteFiles
メソッドを使用できます。
それらは内部的にMLSD
コマンドを使用しますが、コマンドにフォールバックして、LIST
人間が読める形式の数十の異なるリスト形式をサポートできます。
返されるリストは、次のようなプロパティを持つRemoteFileInfo
インスタンスのコレクションとして表示されます。
Name
LastWriteTime
(正しいタイムゾーンで)
Length
FilePermissions
(個人の権利に解析されます)
Group
Owner
IsDirectory
IsParentDirectory
IsThisDirectory
(私はWinSCPの作者です)
他のほとんどのサードパーティライブラリも同じことを行います。この目的でFtpWebRequest
クラスを使用することは信頼できません。残念ながら、.NETFrameworkには他に組み込みのFTPクライアントはありません。