C#将System.IO.Stream转换为Byte[]

29

我想知道如何将流转换为字节。

我找到了以下代码,但在我的情况下它不起作用:

var memoryStream = new MemoryStream();
paramFile.CopyTo(memoryStream);
byte[] myBynary = memoryStream.ToArray();
myBinary = memoryStream.ToArray();
但是在我的情况下,在 paramFile.CopyTo(memoryStream) 这行代码上并没有发生任何事情,没有异常抛出,应用程序仍然可以运行,但是该代码不会继续执行下一行。
谢谢。

啊,抱歉,param file是我在方法中接收的参数,是一个SystemIO.Stream。 - Álvaro García
2个回答

45

如果你正在读取一个文件,只需使用File.ReadAllBytes方法

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

另外,只要您的sourceStream支持Length属性,就没有必要将其复制到MemoryStream中以获取字节数组:

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

1
实际上我有一个流,而不是文件。虽然原始数据是一个文件,但我在WCF中将文件发送到流中。因此,我需要将流转换为byte[]。但这种方法行不通,因为长度属性是长整型,而读取方法使用int。 - Álvaro García
1
只要不超过2147483647(int.MaxValue)字节,这个程序就可以正常工作。否则,您必须使用计数器来组装数组。 - JamieSee

43

这是我为 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;
        }
    }

雅典娜,我想你手头上没有多余的FromByteArray方法吧? :-) 我正在使用你的方法,现在我只需要能够将其转换回来。 - Jason Hartley
1
这可能会有所帮助。https://dev59.com/om445IYBdhLWcg3wssXH - Athens Holloway

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接