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を正常にダウンロードできますか?
なぜStreamReader
ReadToEnd
が文字列を返すのかと思います。私の場合、この文字列はcalc.exeのバイナリコンテンツですか?
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を使用してファイルをダウンロードする方法
StreamReader はテキストリーダーの実装です。つまり、バイナリデータではなくテキストデータを読み取るために使用する必要があります。あなたのケースでは、基になる応答ストリームを直接使用する必要があります。
ファイルをダウンロードする場合、最も簡単な方法は WebClient.DownloadFile メソッドを使用することです。
これにより、ファイルがハードディスクに直接保存されます。
using System.Net;
using (WebClient webClient = new WebClient ())
{
webClient.DownloadFile("http://www.mysite.com/calc.exe", "calc.exe");
}
私はおそらく少し遅れますが、デバッグモードで実行していない場合、ファイルが常に0 kbになるという同じ問題がありました。
StreamReader
を使用する代わりに、実際にStream
オブジェクトのRead()
メソッドを呼び出す必要があります。これにより、byte []バッファーを読み取りデータで埋めるように求められます。これをStreamWriter
またはFileStream
を使用してディスクに書き込むことができます。