Преобразование MemoryStream в FileStream создает сотни одинаковых файлов?

Я получаю доступ к httpwebrequest, который возвращает файл PDF в качестве ответа. Я читаю этот ответ в поток памяти, а затем конвертирую в файл. Проблема в том, что создаются сотни файлов. Не знаю почему, я пробовал много способов, и все делают одно и то же... Это первый метод, который возвращает поток памяти.

        MemoryStream memStream = new MemoryStream();
        byte[] buffer = new byte[2048];

        int bytesRead = 0;
        do
        {
            bytesRead = _ResponseStream.Read(buffer, 0, buffer.Length);
            memStream.Write(buffer, 0, bytesRead);
        } while (bytesRead != 0);

Второй, чтобы преобразовать в FileStream...

            byte[] data = stream.ToArray();

            FileStream fs = new FileStream(newFile, FileMode.CreateNew);
            fs.Write(data, 0, data.Length);

Любые идеи?

РЕДАКТИРОВАТЬ, ЧТОБЫ ДОБАВИТЬ БОЛЬШЕ КОДА...

    public MemoryStream GetToStream()
    {
        if (_Req == null)
            throw new Exception("HttpWebRequest is not initialised");

        GetResult(_Req);

        MemoryStream memStream = new MemoryStream();
        byte[] buffer = new byte[2048];

        int bytesRead = 0;
        do
        {
            bytesRead = _ResponseStream.Read(buffer, 0, buffer.Length);
            memStream.Write(buffer, 0, bytesRead);
        } while (bytesRead != 0);

        _ResponseStream.Close();

        if (memStream.Length > 0)
            return memStream;
        else return null;
    }

newFile — сопоставленный путь к серверу создаваемого файла.

            byte[] data = stream.ToArray();

            FileStream fs = new FileStream(newFile, FileMode.Create);
            fs.Write(data, 0, data.Length);
            fs.Close();

Я пробовал stream.WriteTo(fs), и происходит то же самое. Довольно странно.


person mickyjtwin    schedule 17.02.2009    source источник


Ответы (2)


Совершенно непонятно, зачем вам несколько файлов, но вы должны иметь возможность получить некоторую информацию на основе имен файлов — каждому из них будет соответствовать значение newFile.

Кстати, я заметил, что вы не закрываете свой файловый поток. Использование File.WriteAllBytes — гораздо более простой способ достижения вашей цели и не требует от вас ничего закрывать:

byte[] data = stream.ToArray();
File.WriteAllBytes(newFile, data);

В качестве альтернативы можно по-прежнему использовать FileStream (с оператором using), но использовать MemoryStream.WriteTo, чтобы избежать вызова ToArray, который должен скопировать все данные:

using (FileStream fs = File.Create(newFile))
{
    stream.WriteTo(fs);
}
person Jon Skeet    schedule 17.02.2009

Я бы предположил, что вы получаете больше запросов от вашего клиента, чем вы думаете. Проверьте файл журнала доступа к веб-серверу. Фрагменты кода, которые вы показываете, кажутся разумными, но на самом деле они не показывают достаточно кода, чтобы объяснить проблему - вы показываете не ту часть кода. В любом случае, проверьте журнал доступа или используйте какую-либо трассировку.

person krosenvold    schedule 17.02.2009