14

.exeWeb サイトからファイルをダウンロードしてハード ドライブに保存する必要があるプログラムを作成しています。は私のサイトに保存されており、その.exeURLは次のとおりです(これは、この質問の目的のために作成した実際の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 を正常にダウンロードできますか?

なぜStreamReader ReadToEnd文字列を返すのか不思議です。私の場合、この文字列は calc.exe のバイナリ コンテンツでしょうか?

4

6 に答える 6

13

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を使用してファイルをダウンロードする方法

于 2014-11-29T06:45:52.773 に答える
9

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

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

于 2013-01-07T09:26:35.013 に答える
1

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

于 2013-01-07T09:29:58.517 に答える