2009-02-17 4 views
2

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

 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); 

Любые идеи?

EDIT, чтобы добавить больше КОДА ...

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), и то же самое происходит. Довольно безумный.

ответ

13

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

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

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

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

using (FileStream fs = File.Create(newFile)) 
{ 
    stream.WriteTo(fs); 
} 
0

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