Записывать файл из HttpWebRequest периодически или после окончания загрузки? - PullRequest
2 голосов
/ 19 апреля 2010

Прямо сейчас я использую этот код для загрузки файлов (с заголовком Range). Большинство файлов имеют большой размер, и в настоящее время он загружает 99% ресурсов ЦП. Можно ли периодически записывать файл, чтобы он не оставался в оперативной памяти постоянно?

private byte[] GetWebPageContent(string url, long start, long finish)
{
    byte[] result = new byte[finish];
    HttpWebRequest request;

    request = WebRequest.Create(url) as HttpWebRequest;

    //request.Headers.Add("Range", "bytes=" + start + "-" + finish);

    request.AddRange((int)start, (int)finish);

    using (WebResponse response = request.GetResponse())
    {
        return ReadFully(response.GetResponseStream());
    }    
}

public static byte[] ReadFully(Stream stream)
{
    byte[] buffer = new byte[32768];
    using (MemoryStream ms = new MemoryStream())
    {
        while (true)
        {
            int read = stream.Read(buffer, 0, buffer.Length);
            if (read <= 0)
                return ms.ToArray();
            ms.Write(buffer, 0, read);
        }
    }
}

1 Ответ

3 голосов
/ 19 апреля 2010

Вместо записи данных в MemoryStream (который хранит данные в памяти), запишите данные в FileStream (который хранит данные в файле на диске).

byte[] buffer = new byte[32768];
using (FileStream fileStream = File.Create(path))
{
    while (true)
    {
        int read = stream.Read(buffer, 0, buffer.Length);
        if (read <= 0)
            break;
        fileStream.Write(buffer, 0, read);
    }
}

Использование .NET 4.0:

using (FileStream fileStream = File.Create(path))
{
    stream.CopyTo(fileStream);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...