23

私のアプリケーションでは、WebClientクラスを使用して、 DownloadFileメソッドを呼び出すだけで Web サーバーからファイルをダウンロードします。ここで、特定のファイルをダウンロードする前に存在するかどうかを確認する必要があります (または、存在することを確認したい場合)。それについて2つの質問があります:

  1. ネットワーク経由で大量のデータを転送せずにファイルがサーバー上に存在するかどうかを確認する最良の方法は何ですか? (チェックする必要があるファイルの数は非常に膨大です)
  2. ダウンロードせずに特定のリモート ファイルのサイズを取得する方法はありますか?

前もって感謝します!

4

4 に答える 4

45

WebClientかなり制限されています。を使用するように切り替えるとWebRequest、HTTP HEAD リクエストを送信できるようになります。リクエストを発行すると、エラー (ファイルが見つからない場合) が返されるかWebResponse、有効なContentLengthプロパティが返されます。

編集:コード例:

WebRequest request = WebRequest.Create(new Uri("http://www.example.com/"));
request.Method = "HEAD";

using(WebResponse response = request.GetResponse()) {
   Console.WriteLine("{0} {1}", response.ContentLength, response.ContentType);
}
于 2009-05-06T16:26:36.377 に答える
5

WebClientクラスを使用してファイルを要求すると、404 エラー (ファイルが見つかりません) によって例外が発生します。最善の方法は、その例外を処理し、ファイルが存在するかどうかを確認するために設定できるフラグを使用することです。

サンプル コードは次のようになります。

System.Net.HttpWebRequest request = null;
System.Net.HttpWebResponse response = null;
request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create("www.example.com/somepath");
request.Timeout = 30000;
try
{
    response = (System.Net.HttpWebResponse)request.GetResponse();
    flag = 1;
}
catch 
{
    flag = -1;
}

if (flag==1)
{
    Console.WriteLine("File Found!!!");
}
else
{
    Console.WriteLine("File Not Found!!!");
}

コードをそれぞれの if ブロックに入れることができます。それが役に立てば幸い!

于 2014-03-05T08:12:45.310 に答える
0

誰かが SSL 証明書の問題で立ち往生した場合

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback
                                                                            (
                                                                               delegate { return true; }
                                                                            );
            WebRequest request = WebRequest.Create(new Uri("http://.com/flower.zip"));
            request.Method = "HEAD";

            using (WebResponse response = request.GetResponse())
            {
                Console.WriteLine("{0} {1}", response.ContentLength, response.ContentType);
            }
于 2021-07-17T13:00:42.287 に答える