2009-02-17 69 views
2

我正在訪問一個返回PDF文件作爲響應的httpwebrequest。我正在將該響應讀入內存流,然後轉換爲文件。問題是,是否有數百個文件正在創建。不知道爲什麼,我已經嘗試了很多方法,並且都做了相同的... 這是返回內存流的第一個方法。將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); 

任何想法?

編輯以添加更多的代碼...

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

另一種方法是仍然使用FileStream(帶using語句),但使用MemoryStream.WriteTo避免通話到ToArray其中必須複製所有數據:

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

我建議您收到客戶的更多請求,而不是您認爲的。檢查您的網絡服務器訪問日誌文件。您顯示的代碼片段看起來很合理,但並沒有顯示足夠的代碼來解釋問題 - 您沒有顯示代碼的正確部分。無論如何,檢查訪問日誌或使用某種跟蹤。

相關問題