FtpWebRequestの前にFTPにファイルが存在するかどうかを確認する方法
-
20-08-2019 - |
質問
FtpWebRequest
を使用してFTPディレクトリにファイルを配置する必要があります。アップロードする前に、まずこのファイルが存在するかどうかを知りたいです。
このファイルが存在するかどうかを確認するには、どのメソッドまたはプロパティを使用すればよいですか?
解決
var request = (FtpWebRequest)WebRequest.Create
("ftp://ftp.domain.com/doesntexist.txt");
request.Credentials = new NetworkCredential("user", "pass");
request.Method = WebRequestMethods.Ftp.GetFileSize;
try
{
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
}
catch (WebException ex)
{
FtpWebResponse response = (FtpWebResponse)ex.Response;
if (response.StatusCode ==
FtpStatusCode.ActionNotTakenFileUnavailable)
{
//Does not exist
}
}
一般的なルールとして、このようなコードの機能に例外を使用することはお勧めできませんが、この例ではプラグマティズムの勝利だと思います。ディレクトリの呼び出しリストは、この方法で例外を使用するよりもはるかに効率が悪い可能性があります。
そうでない場合は、それが良い習慣ではないことに注意してください!
編集:<!> quot;それは私のために働きます!<!> quot;
これはほとんどのftpサーバーで機能するように見えますが、すべてではありません。一部のサーバーでは、<!> quot; TYPE I <!> quot; SIZEコマンドが機能する前に。次のように問題を解決する必要があると考えていたでしょう:
request.UseBinary = true;
残念ながら、FtpWebRequestがファイルをダウンロードまたはアップロードしていない限り、<!> quot; TYPE I <!> quot;を送信しないという設計上の制限です(大きなバグです!)。ディスカッションとマイクロソフトの対応をご覧くださいこちら。
代わりに次のWebRequestMethodを使用することをお勧めします。これは、ファイルサイズを返さないサーバーでも、テストしたすべてのサーバーで機能します。
WebRequestMethods.Ftp.GetDateTimestamp
他のヒント
理由
request.Method = WebRequestMethods.Ftp.GetFileSize
場合によっては失敗する可能性があります(550:ASCIIモードではSIZEは許可されません)。代わりにタイムスタンプを確認するだけです。
reqFTP.Credentials = new NetworkCredential(inf.LogOn, inf.Password);
reqFTP.UseBinary = true;
reqFTP.Method = WebRequestMethods.Ftp.GetDateTimestamp;
FtpWebRequest
(.NETの他のクラスも)には、ファイルの存在を確認するための明示的なメソッドがありません。 GetFileSize
やGetDateTimestamp
などのリクエストを悪用する必要があります。
string url = "ftp://ftp.example.com/remote/path/file.txt";
WebRequest request = WebRequest.Create(url);
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.GetFileSize;
try
{
request.GetResponse();
Console.WriteLine("Exists");
}
catch (WebException e)
{
FtpWebResponse response = (FtpWebResponse)e.Response;
if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
{
Console.WriteLine("Does not exist");
}
else
{
Console.WriteLine("Error: " + e.Message);
}
}
より簡単なコードが必要な場合は、サードパーティのFTPライブラリを使用してください。
たとえば、 WinSCP .NETアセンブリの場合、 Session.FileExists
メソッド:
SessionOptions sessionOptions = new SessionOptions {
Protocol = Protocol.Ftp,
HostName = "ftp.example.com",
UserName = "username",
Password = "password",
};
Session session = new Session();
session.Open(sessionOptions);
if (session.FileExists("/remote/path/file.txt"))
{
Console.WriteLine("Exists");
}
else
{
Console.WriteLine("Does not exist");
}
(私はWinSCPの著者です)
FTPStatusCode.FileActionOKを使用してファイルが存在するかどうかを確認します...
その後、<!> quot; else <!> quot;セクション、falseを返します。