65


15

FtpWebRequestの前にファイルがFTPに存在するかどうかを確認する方法

FTPディレクトリにファイルを置くためには `FtpWebRequest`を使う必要があります。 アップロードの前に、まずこのファイルが存在するかどうかを知りたいです。

このファイルが存在するかどうかを確認するためにどのメソッドまたはプロパティを使用すればよいですか?

4 回答


110


var request =(FtpWebRequest)WebRequest.Create( "ftp://ftp.domain.com/doesntexist.txt"); request.Credentials = new NetworkCredential( "user"、 "pass"); request.Method = WebRequestMethods.Ftp.GetFileSize;

{FtpWebResponse response =(FtpWebResponse)request.GetResponse();}を試してください。 catch(WebException ex){FtpWebResponseレスポンス=(FtpWebResponse)ex.Response;} if(response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable){//存在しません}}

一般的な規則として、このようにコード内の機能にExceptionsを使用することはお勧めできませんが、この例ではプラグマティズムに勝つことができると思います。 ディレクトリの呼び出しリストは、このように例外を使用するよりもはるかに非効率的になる可能性があります。

そうでなければ、それは良い習慣ではないことに気をつけてください!

編集: "それは私のために働く!"

これはほとんどのftpサーバーでは動作するようですが、全部ではありません。 SIZEコマンドが機能する前に、 "TYPE I"を送信する必要があるサーバーもあります。 問題は次のように解決されるべきだと考える人もいるでしょう。

request.UseBinary = true;

残念ながら、FtpWebRequestがファイルをダウンロードまたはアップロードしているのでなければ、 "TYPE I"が送信されないという設計上の制限(大きなバグがあります)です。 ディスカッションおよびマイクロソフトの対応 hereを参照してください。

代わりに次のWebRequestMethodを使用することをお勧めします。これは、テストしたすべてのサーバー(ファイルサイズが返されないサーバーも含む)で動作します。

WebRequestMethods.Ftp.GetDateTimestamp


7


なぜなら

request.Method = WebRequestMethods.Ftp.GetFileSize

場合によっては失敗するかもしれません(550:ASCIIモードではSIZEは使えません)。代わりにTimestampをチェックすることができます。

reqFTP.Credentials = new NetworkCredential(inf.LogOn、inf.Password); reqFTP.UseBinary = true; reqFTP.Method = WebRequestMethods.Ftp.GetDateTimestamp;


2


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ライブラリを使用してください。

例えばhttps://winscp.net/eng/docs/library[WinSCP .NETアセンブリ]では、そのhttps://winscp.net/eng/docs/library_session_fileexists [`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の作者です)


-1


私はファイルが存在するかどうかを確認するためにFTPStatusCode.FileActionOKを使います…​

それから、 "else"セクションで、falseを返します。