web-dev-qa-db-ja.com

HttpWebRequest / Responseを使用してWebサーバーからバイナリ(.exe)ファイルをダウンロードする方法

Webサイトから.exeファイルをダウンロードして、ハードドライブに保存する必要があるプログラムを書いています。 .exeは私のサイトに保存されており、そのURLは次のとおりです(これは、この質問のために作成した実際のURIではありません)。

http://www.mysite.com/calc.exe

多くのWeb検索と例のあちこちの後で、ここに私がこれまでに思いついたコードがあります。

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(http://www.mysite.com/calc.exe);
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
Stream responseStream = webResponse.GetResponseStream();               
StreamReader streamReader = new StreamReader(responseStream);
string s = streamReader.ReadToEnd();

ご覧のとおり、私はStreamReaderクラスを使用してデータを読み取っています。 ReadToEndを呼び出した後、ストリームリーダーに.exeの(バイナリ)コンテンツが含まれていますか? StreamReaderの内容をファイル(calc.exeという名前)に書き込むだけで、.exeを正常にダウンロードできますか?

なぜStreamReaderReadToEndが文字列を返すのかと思います。私の場合、この文字列はcalc.exeのバイナリコンテンツですか?

11
Jan Tacci

WebClientはファイルをダウンロードするための最良の方法です。ただし、次の方法を使用して、Webサーバーから非同期でファイルをダウンロードできます。

private static void DownloadCurrent()
{
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("[url to download]");
    webRequest.Method = "GET";
    webRequest.Timeout = 3000;
    webRequest.BeginGetResponse(new AsyncCallback(PlayResponeAsync), webRequest);
}

private static void PlayResponeAsync(IAsyncResult asyncResult)
{
    long total = 0;
    long received = 0;
    HttpWebRequest webRequest = (HttpWebRequest)asyncResult.AsyncState;

    try
    {                    
        using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(asyncResult))
        {
            byte[] buffer = new byte[1024];

            FileStream fileStream = File.OpenWrite("[file name to write]");
            using (Stream input = webResponse.GetResponseStream())
            {        
                total = input.Length;

                int size = input.Read(buffer, 0, buffer.Length);
                while (size > 0)
                {
                    fileStream.Write(buffer, 0, size);
                    received += size;

                    size = input.Read(buffer, 0, buffer.Length);
                }
            }

            fileStream.Flush();
            fileStream.Close();
        }                 
    }
    catch (Exception ex)
    {
    }
}

ここには同様のスレッドがあります- httpwebrequestを使用してファイルをダウンロードする方法

12
Dipu

StreamReader はテキストリーダーの実装です。つまり、バイナリデータではなくテキストデータを読み取るために使用する必要があります。あなたのケースでは、基になる応答ストリームを直接使用する必要があります。

ファイルをダウンロードする場合、最も簡単な方法は WebClient.DownloadFile メソッドを使用することです。

7
VinayC

これにより、ファイルがハードディスクに直接保存されます。

using System.Net;
using (WebClient webClient = new WebClient ())
{
    webClient.DownloadFile("http://www.mysite.com/calc.exe", "calc.exe");
}
3
user2492339

私はおそらく少し遅れますが、デバッグモードで実行していない場合、ファイルが常に0 kbになるという同じ問題がありました。

1
ThexBasic

StreamReaderを使用する代わりに、実際にStreamオブジェクトのRead()メソッドを呼び出す必要があります。これにより、byte []バッファーを読み取りデータで埋めるように求められます。これをStreamWriterまたはFileStreamを使用してディスクに書き込むことができます。

1
dotNET