Конвертировать MemoryStream в FileStream создает сотни одинаковых файлов? - PullRequest
2 голосов
/ 17 февраля 2009

Я получаю доступ к 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), и происходит то же самое. Довольно странно.

Ответы [ 2 ]

13 голосов
/ 17 февраля 2009

Не совсем понятно, почему вы получите несколько файлов, но вы должны иметь возможность получить некоторую информацию, основанную на именах файлов - каждый из них будет соответствовать значению 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);
}
0 голосов
/ 17 февраля 2009

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

...