MLSD
残念ながら、.NET フレームワークは FTPコマンドをサポートしていないため、.NET フレームワークが提供する機能を使用してタイムスタンプを取得する、信頼性が高く効率的な方法はありません。このMLSD
コマンドは、標準化された機械可読形式でリモート ディレクトリのリストを提供します。コマンドとフォーマットはRFC 3659によって標準化されています。
.NET フレームワークでサポートされている、使用できる代替手段:
ListDirectoryDetails
メソッド (FTPLIST
コマンド) を使用してディレクトリ内のすべてのファイルの詳細を取得し、FTP サーバー固有の詳細形式を処理します (* ls
nix コマンドに類似した *nix 形式が最も一般的です。欠点は、形式が変更される可能性があることです)。新しいファイルには「May 8 17:48」形式が使用され、古いファイルには「Oct 18 2009」形式が使用されます)。
DOS/Windows 形式: WebRequestMethods.Ftp.ListDirectoryDetails FTP レスポンスを解析する C# クラス
*nix 形式: FtpWebRequest ListDirectoryDetails 行の解析
GetDateTimestamp
メソッド (FTPMDTM
コマンド) を使用して、各ファイルのタイムスタンプを個別に取得します。利点は、応答がRFC 3659によって標準化されていることYYYYMMDDHHMMSS[.sss]
です。欠点は、ファイルごとに個別のリクエストを送信する必要があることです。これは非常に非効率的です。
const string uri = "ftp://example.com/remote/path/file.txt";
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
request.Method = WebRequestMethods.Ftp.GetDateTimestamp;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Console.WriteLine("{0} {1}", uri, response.LastModified);
または、modernMLSD
コマンドをサポートするサード パーティの FTP クライアント実装を使用することもできます。
たとえば、WinSCP .NET アセンブリはそれをサポートしています。
特定のタスクの例もあります: Downloading the latest file .
この例は PowerShell と SFTP 用ですが、C# と FTP に簡単に変換できます。
// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Ftp,
HostName = "example.com",
UserName = "username",
Password = "password",
};
using (Session session = new Session())
{
// Connect
session.Open(sessionOptions);
// Get list of files in the directory
string remotePath = "/remote/path/";
RemoteDirectoryInfo directoryInfo = session.ListDirectory(remotePath);
// Select the most recent file
RemoteFileInfo latest =
directoryInfo.Files
.OrderByDescending(file => file.LastWriteTime)
.First();
// Download the selected file
string localPath = @"C:\local\path\";
string sourcePath = RemotePath.EscapeFileMask(remotePath + latest.Name);
session.GetFiles(sourcePath, localPath).Check();
}
(私は WinSCP の作者です)