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
のフォルダーに保存していますが、各ファイル名を繰り返し処理して日付を取得するにはどうすればよいですか?最新のファイルを見つけることができるように、日付を取得したいと思います。ありがとう。
WebRequestMethods.Ftp.ListDirectory
は、FTPディレクトリ内のすべてのファイルの「ショートリスト」を返します。このタイプのリストは、ファイル名のみを提供し、ファイルの追加の詳細(アクセス許可や最終変更日など)は提供しません。
使用する WebRequestMethods.Ftp.ListDirectoryDetails
代わりに。このメソッドは、FTPサーバー上のファイルの長いリストを返します。このリストをnames
変数に取得したら、names
変数を行末文字に基づいて配列に分割できます。これにより、各配列要素は、アクセス許可、最終変更日の所有者などを含むファイル(またはディレクトリ)名リストになります。
この時点で、この配列を反復処理し、各ファイルの最終変更日を調べて、ファイルをダウンロードするかどうかを決定できます。
これがお役に立てば幸いです!!
これは問題なく機能しているようです 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);
残念ながら、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.ListDirectoryDetails FTP応答を解析するC#クラス
* nix形式: FtpWebRequest ListDirectoryDetails行の解析
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の作者です)