2012-06-29 142 views
13

我想知道如何將一個流轉換爲一個字節。c#convert system.IO.Stream to Byte []

我發現這個代碼,但對我來說這是行不通的:

var memoryStream = new MemoryStream(); 
paramFile.CopyTo(memoryStream); 
byte[] myBynary = memoryStream.ToArray(); 
myBinary = memoryStream.ToArray(); 

但在我的情況下,在該行paramFile.CopyTo(MemoryStream的),它發生什麼,也不例外,應用仍然有效,但代碼不會繼續下一行。

謝謝。

+0

什麼是paramFile? –

+0

啊,對不起,param文件是我在方法中收到的參數,是一個SystemIO.Stream。 –

回答

30

byte[] myBinary = File.ReadAllBytes(@"C:\MyDir\MyFile.bin"); 

而且,也沒有必要CopyTo從一個MemoryStream只要你的sourceStream支持Length屬性就可以得到一個字節數組:

byte[] myBinary = new byte[paramFile.Length]; 
paramFile.Read(myBinary, 0, (int)paramFile.Length); 
+0

真的我有一個流,沒有文件。儘管原始數據是一個文件,但我將文件發送到WCF中的流中。所以我需要將流轉換爲byte []。但是這種方式不起作用,因爲length屬性很長,並且read方法使用int。 –

+1

只要你不超過2147483647(int.MaxValue)字節這工作正常。否則,你必須組裝一個計數器。 – JamieSee

26

這是一個擴展方法我如果你正在讀一個文件只使用File.ReadAllBytes Method寫的Stream類

public static class StreamExtensions 
    { 
     public static byte[] ToByteArray(this Stream stream) 
     { 
      stream.Position = 0; 
      byte[] buffer = new byte[stream.Length]; 
      for (int totalBytesCopied = 0; totalBytesCopied < stream.Length;) 
       totalBytesCopied += stream.Read(buffer, totalBytesCopied, Convert.ToInt32(stream.Length) - totalBytesCopied); 
      return buffer; 
     } 
    } 
+0

雅典,我想你沒有額外的FromByteArray方法鋪設? :-)我正在使用你的方法,我現在只需要能夠將它轉換回來。 –

+1

這可能有所幫助。 http://stackoverflow.com/questions/4736155/how-do-i-convert-byte-to-stream-in-c –