Преобразование 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)


arrow_upward
13
arrow_downward

Совершенно непонятно, зачем вам несколько файлов, но вы должны иметь возможность получить некоторую информацию на основе имен файлов — каждому из них будет соответствовать значение 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

arrow_upward
0
arrow_downward

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

person krosenvold    schedule 17.02.2009