15

私は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、これらのそれぞれを反復処理して日付を取得するにはどうすればよいですか? 最新のファイルを見つけることができるように、日付を取得したいと考えています。ありがとう。

4

4 に答える 4

27

これは問題なく動作するようです 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);
于 2011-09-27T18:58:30.033 に答える
15

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

.NET フレームワークでサポートされている、使用できる代替手段:

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

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

  • 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 の作者です)

于 2015-05-18T14:34:20.237 に答える
14

WebRequestMethods.Ftp.ListDirectoryFTP ディレクトリ内のすべてのファイルの「短いリスト」を返します。このタイプのリストでは、ファイル名のみが提供され、ファイルに関する追加の詳細 (権限や最終更新日など) は提供されません。

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

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

これが役立つことを願っています!!

于 2010-12-15T21:37:14.597 に答える
-2

String.Split最初に、ファイル名区切り文字を使用して名前を分割する必要があります。次に、すべての文字列を繰り返し処理し、ディレクトリをナビゲートします

于 2010-12-15T20:59:52.787 に答える