将 System.IO.Stream 转换为 Byte[] [重复]

Posted

技术标签:

【中文标题】将 System.IO.Stream 转换为 Byte[] [重复]【英文标题】:Converting System.IO.Stream to Byte[] [duplicate] 【发布时间】:2017-12-09 06:39:08 【问题描述】:

我正在寻找可以将 System.IO.Stream 转换为 byte[] 的 C# 语言解决方案。我已经尝试了下面的代码,但我收到的 byte[] 为空。有人可以指导我从下面的代码中缺少什么吗?我从 Alfresco Web 服务接收,除非保存到临时位置,否则我无法读取文件。

 private static byte[] ReadFile(Stream fileStream)
    
        byte[] bytes = new byte[fileStream.Length];

        fileStream.Read(bytes, 0, Convert.ToInt32(fileStream.Length));
        fileStream.Close();

        return bytes;

        //using (MemoryStream ms = new MemoryStream())
        //
        //    int read;
        //    while ((read = fileStream.Read(bytes, 0, bytes.Length)) > 0)
        //    
        //        fileStream.CopyTo(ms);
        //    
        //    return ms.ToArray();
        //
    

【问题讨论】:

检查这个:***.com/questions/221925/… 流可以很大(大于允许的数组大小),甚至无限大;一般来说,这不是一个好主意! 【参考方案1】:

一旦我为它做了一个扩展方法:

public static byte[] ToArray(this Stream s)

    if (s == null)
        throw new ArgumentNullException(nameof(s));
    if (!s.CanRead)
        throw new ArgumentException("Stream cannot be read");

    MemoryStream ms = s as MemoryStream;
    if (ms != null)
        return ms.ToArray();

    long pos = s.CanSeek ? s.Position : 0L;
    if (pos != 0L)
        s.Seek(0, SeekOrigin.Begin);

    byte[] result = new byte[s.Length];
    s.Read(result, 0, result.Length);
    if (s.CanSeek)
        s.Seek(pos, SeekOrigin.Begin);
    return result;

【讨论】:

请注意,即使查询 .Position 也可能会失败 - 并非所有流都支持这一点 好点,已修复。顺便说一句,我也需要修复我的库。 :)

以上是关于将 System.IO.Stream 转换为 Byte[] [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将字符串转换为 System.IO.Stream [重复]

将 System.IO.Stream 转换为 Byte[] [重复]

c# 将 system.IO.Stream 转换为 Byte[] [重复]

如何将 IStream(C++) 转换为 System::IO::Stream(c#),反之亦然

如何在 System.IO.Stream 中转换 System.Byte[]?

无法将“Microsoft.Asp.NetCore.Http.FormFile”类型的对象转换为在 Asp.NetCore MVC Web 应用程序中键入“System.IO.Stream”