web-dev-qa-db-ja.com

ファイルの作成日を取得する(FTP)

System.Net.FtpWebRequestクラスを使用していますが、コードは次のとおりです。

FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://example.com/folder");
request.Method = WebRequestMethods.Ftp.ListDirectory;

request.Credentials = new NetworkCredential("username", "password");

FtpWebResponse response = (FtpWebResponse)request.GetResponse();

Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);

string names = reader.ReadToEnd();

reader.Close();
response.Close();

これはMSDNで提供されている例に基づいていますが、これ以上詳細なものは見つかりませんでした。

すべてのファイル名をnamesのフォルダーに保存していますが、各ファイル名を繰り返し処理して日付を取得するにはどうすればよいですか?最新のファイルを見つけることができるように、日付を取得したいと思います。ありがとう。

15
Radu

WebRequestMethods.Ftp.ListDirectoryは、FTPディレクトリ内のすべてのファイルの「ショートリスト」を返します。このタイプのリストは、ファイル名のみを提供し、ファイルの追加の詳細(アクセス許可や最終変更日など)は提供しません。

使用する WebRequestMethods.Ftp.ListDirectoryDetails代わりに。このメソッドは、FTPサーバー上のファイルの長いリストを返します。このリストをnames変数に取得したら、names変数を行末文字に基づいて配列に分割できます。これにより、各配列要素は、アクセス許可、最終変更日の所有者などを含むファイル(またはディレクトリ)名リストになります。

この時点で、この配列を反復処理し、各ファイルの最終変更日を調べて、ファイルをダウンロードするかどうかを決定できます。

これがお役に立てば幸いです!!

14
pmartin

これは問題なく機能しているようです http://msdn.Microsoft.com/en-us/library/system.net.ftpwebresponse.lastmodified(v = VS.90).aspx

FtpWebRequest request = (FtpWebRequest)WebRequest.Create (serverUri);
request.Method = WebRequestMethods.Ftp.GetDateTimestamp;
FtpWebResponse response = (FtpWebResponse)request.GetResponse ();
Console.WriteLine ("{0} {1}",serverUri,response.LastModified);
26
Jack0fshad0ws

残念ながら、FTP MLSDコマンドをサポートしていないため、.NETFrameworkが提供する機能を使用してタイムスタンプを取得するための信頼性が高く効率的な方法はありません。 MLSDコマンドは、標準化された機械可読形式でリモートディレクトリのリストを提供します。コマンドとフォーマットは RFC 3659 によって標準化されています。

.NET Frameworkでサポートされている、使用できる代替手段:

  • ListDirectoryDetailsメソッド(FTP LISTコマンド)を使用してディレクトリ内のすべてのファイルの詳細を取得し、FTPサーバー固有の詳細形式(* nix形式はls * nixコマンドが最も一般的ですが、欠点は、新しいファイルでは「May 8 17:48」形式が使用され、古いファイルでは「Oct 182009」形式が使用されるため、時間の経過とともに形式が変わる可能性があることです。

    DOS/Windows形式: WebRequestMethods.Ftp.ListDirectoryDe​​tails FTP応答を解析するC#クラス
    * nix形式: FtpWebRequest ListDirectoryDe​​tails行の解析

  • GetDateTimestampメソッド(FTP MDTMコマンド)。各ファイルのタイムスタンプを個別に取得します。利点は、応答がYYYYMMDDHHMMSS[.sss]に対して RFC 3659 によって標準化されることです。欠点は、ファイルごとに個別のリクエストを送信する必要があることです。これは非常に非効率的です。

    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);
    

または、最新のMLSDコマンドをサポートするサードパーティのFTPクライアント実装を使用することもできます。

たとえば WinSCP .NET Assembly はそれをサポートします。

特定のタスクの例もあります: 最新のファイルをダウンロードする
この例は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の作者です)

14
Martin Prikryl