2012-04-12 1 views
2

FTPの特定のフォルダからファイルをダウンロードする必要がありますが、作成時間は1時間以内です。だから、基本的に私は、そのフォルダからすべてのファイルをリストし、タイムスタンプが実行時間から1時間以上変化しないものだけをダウンロードする必要があります。どのようにFTP上のファイルのタイムスタンプを解析するためのアイデアですか?サードパーティのFTPクライアントライブラリを使用することはできません。最後の1時間以内に作成されたファイルをFTPからダウンロードする

+1

OPは、タイムスタンプを取得した場合SOポスト、以下を参照してください。http://stackoverflow.com/questions/1040371/system-net-ftpwebrequest-をgetdatetimestamp-example –

+0

@Georgeありがとうございました!それは私が必要としていたようです。 –

答えて

1

これは私が今思いついたものです。

foreach (var fileName in filesNamesFromFtpFolder) 
     { 
      FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(@"ftp://" + host + @"/" + folder + @"/" + fileName); 

      request.Method = WebRequestMethods.Ftp.GetDateTimestamp; 
      request.Proxy = null; 

      using (FtpWebResponse resp = (FtpWebResponse)request.GetResponse()) 
      { 
       if (DateTime.Now.Subtract(TimeSpan.FromMinutes(60)) < resp.LastModified) 
       { 
        //download this file... 
       } 
      } 
     } 
1

メインタスクは、読み取りファイルのタイムスタンプではなく、最後の1時間以内に変更されたと判断することができます。サーバーが同じTimeZoneにある場合は、時間と同じになります。そうでない場合は、時間のずれがあります。常に同じサーバーを使用している場合、これはかなり信頼できる方法で修正できます。しかし、世界中の複数のサーバーを使用している場合、これはもう少し複雑になります。だから注意してください。

0

は残念ながら、.NETフレームワークによって提供される機能を使用してディレクトリ内のすべてのファイルの変更のタイムスタンプを取得するには何の本当に信頼性の高い効率的な方法はそれとして、ありませんこれを処理するためにいくつかのより多くのエレガントな方法があることを確認したが... FTP MLSDをサポートしていません。 MLSDコマンドは、標準化された機械可読フォーマットのリモートディレクトリのリストを提供します。コマンドとフォーマットはRFC 3659で標準化されています。 .NETフレームワークによってサポートされている

あなたが使用できる代替、:ディレクトリ内のすべてのファイルの詳細を取得するために

  • ListDirectoryDetails方法(FTP LISTコマンド)、その後、あなたはFTPサーバの特定のフォーマットを扱います詳細の

    DOS/Windows形式:C# class to parse WebRequestMethods.Ftp.ListDirectoryDetails FTP response
    * nixのフォーマット:Parsing FtpWebRequest ListDirectoryDetails line

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

    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); 
    if (response.LastModified > DateTime.Now.Subtract(TimeSpan.FromHours(1))) 
    { 
        // download 
    } 
    

ウェイ簡単に(私はあなたがいないことを知って)現代MLSDコマンドをサポートしているサードパーティ製のFTPクライアントの実装やその缶を使用することです時間制約を与えられたファイルを直接ダウンロードする。

たとえば、WinSCP .NET assemblyは、MLSDtime constraintsの両方をサポートします。

あなたの特定のタスクのためにも例があります:How do I transfer new/modified files only?
の例では、PowerShell用ですが、C#に容易に変換されますが:

// Setup session options 
SessionOptions sessionOptions = new SessionOptions 
{ 
    Protocol = Protocol.Ftp, 
    HostName = "ftp.example.com", 
    UserName = "username", 
    Password = "password", 
}; 

using (Session session = new Session()) 
{ 
    // Connect 
    session.Open(sessionOptions); 

    // Download files modified with the last hour 
    TransferOptions transferOptions = new TransferOptions(); 
    transferOptions.FileMask = "*>=1H"; 
    session.GetFiles("/remote/path/*", @"C:\local\path\", false, transferOptions).Check(); 
} 

time constraintsの構文を参照してください。

(私はWinSCPのの著者です)

関連する問題