2

これは、サーバーからZIPファイルをダウンロードするためのC#コードです。ダウンロードしてもファイルが届きませんが、部分的にダウンロードされています。

public static void Download(String strURLFileandPath, String strFileSaveFileandPath)
{
    HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(strURLFileandPath);
    HttpWebResponse ws = (HttpWebResponse)wr.GetResponse();
    Stream str = ws.GetResponseStream();
    byte[] inBuf = new byte[100000];
    int bytesToRead = (int)inBuf.Length;
    int bytesRead = 0;
    while (bytesToRead > 0)
    {
        int n = str.Read(inBuf, bytesRead, bytesToRead);
        if (n == 0)
            break;
        bytesRead += n;
        bytesToRead -= n;
    }
    try
    {

        FileStream fstr = new FileStream(strFileSaveFileandPath, FileMode.OpenOrCreate, FileAccess.Write);
        fstr.Write(inBuf, 0, bytesRead);
        str.Close();
        fstr.Close();
    }
    catch (Exception e) {
        MessageBox.Show(e.Message);
    }
}

ここで問題が発生していると思います

byte[] inBuf = new byte[100000];

の値を増やすbyte[] inBuf = new byte[100000];byte[] inBuf = new byte[10000000];

ファイルは完全にダウンロードされています。

しかし、私の問題は、50 MB(例:200 MB)を超えるファイルをダウンロードする場合です。

この方法は良くありません。

誰かがこの問題を解決する方法を教えてもらえますか?

4

3 に答える 3

3

Stream.CopyTo()メソッドを使用して、ストリームからストリームに直接コピーできます。

またはさらに簡単:WebClientクラスとそのDownloadFileメソッドを使用してファイルをダウンロードします。このソリューションは、完全なメソッドを置き換えます。

var client = new WebClient();
client.DownloadFile(strURLFileandPath, strFileSaveFileandPath);
于 2012-07-27T12:10:04.077 に答える
0

読みながらファイルを書きます。そうすれば、書き込みまたはダウンロードを完了する前に、すべてのバイトをメモリに保持する必要がなくなります。

FileStream fstr = new FileStream(strFileSaveFileandPath, FileMode.OpenOrCreate, FileAccess.Write);
int bytesRead;
do
{
    bytesRead = str.Read(inBuf, 0, bytesToRead);
    fstr.Write(inBuf, 0, bytesRead);
}while (bytesToRead > 0);

str.Close();
fstr.Close();
于 2012-07-27T12:09:10.663 に答える
0

フェロが使用するのが最善だと示唆したようにStream.CopyTo()

ただし、手動でストリーミングするためにストリームをコピーすることを決定した場合(または将来ストリームを使用する方法を知る必要がある場合)、バッファサイズを手動で指定しないでください。通常、過度のメモリ消費を避けるために、オーバーラップのない最大サイズのバッファを使用する必要がありContentLengthます。ResponseSreamの場合は、ストリームリーダー用に取得できます。

 HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(strURLFileandPath);
 HttpWebResponse ws = (HttpWebResponse)wr.GetResponse();
 Stream str = ws.GetResponseStream();
 byte[] inBuf = new byte[str.ContentLength];
 int bytesToRead = (int)inBuf.Length;

Flush()また、あなたの出力を覚えておいてください。

于 2012-07-27T12:10:13.157 に答える