24

C#コンソールアプリケーションでHTTP経由で大きなファイル(2 GB)をダウンロードする必要があります。問題は、約1.2 GBを超えると、アプリケーションのメモリが不足することです。

これが私が使用しているコードです:

WebClient request = new WebClient();
request.Credentials = new NetworkCredential(username, password);
byte[] fileData = request.DownloadData(baseURL + fName);

ご覧のとおり...ファイルを直接メモリに読み込んでいます。HTTPからデータをチャンクで読み戻し、ディスク上のファイルに書き込むとしたら、これを解決できると確信しています。

どうすればこれを行うことができますか?

4

6 に答える 6

39

WebClient.DownloadFileを使用する場合は、ファイルに直接保存できます。

于 2009-07-03T09:25:00.593 に答える
37

WebClientクラスは、単純化されたシナリオ用のクラスです。単純なシナリオを乗り越えたら(そしてそれができたら)、少しフォールバックしてWebRequestを使用する必要があります。

WebRequestを使用すると、応答ストリームにアクセスでき、完了するまで、応答ストリームをループして、少しずつ読み取り、書き込みを行うことができます。

Microsoftのドキュメントから:

新しい開発にWebRequestまたはその派生クラスを使用することはお勧めしません。代わりに、System.Net.Http.HttpClientクラスを使用してください。

ソース:docs.microsoft.com/WebRequest


例:

public void MyDownloadFile(Uri url, string outputFilePath)
{
    const int BUFFER_SIZE = 16 * 1024;
    using (var outputFileStream = File.Create(outputFilePath, BUFFER_SIZE))
    {
        var req = WebRequest.Create(url);
        using (var response = req.GetResponse())
        {
            using (var responseStream = response.GetResponseStream())
            {
                var buffer = new byte[BUFFER_SIZE];
                int bytesRead;
                do
                {
                    bytesRead = responseStream.Read(buffer, 0, BUFFER_SIZE);
                    outputFileStream.Write(buffer, 0, bytesRead);
                } while (bytesRead > 0);
            }
        }
    }
}

WebClient.DownloadFileが機能する場合、私はそれを最良の解決策と呼ぶことに注意してください。「DownloadFile」の回答が投稿される前に、上記を書きました。また、早朝に書いたので、一粒の塩(そしてテスト)が必要になるかもしれません。

于 2009-07-03T09:21:51.210 に答える
9
于 2009-07-03T09:21:33.333 に答える
3

WebClient.OpenRead は Stream を返します。Read を使用してコンテンツをループするだけなので、データはメモリにバッファリングされませんが、ブロック単位でファイルに書き込むことができます。

于 2013-01-25T09:36:30.990 に答える
2

私はこのようなものを使用します

于 2009-07-03T09:30:11.470 に答える