在C#中将流转换为文件流

17
什么是使用C#将流(Stream)转换为FileStream的最佳方法?
我正在处理一个包含上传数据的Stream,需要执行FileStream类型的stream.Read()和stream.Seek()方法。简单的强制转换并不起作用,因此我在这里请求帮助。

为什么强制转换不起作用?你传入的 Stream 对象是什么类型? - Gerrie Schenck
2
这是荒谬的操作。如果流不支持“读取/查找” - 那么强制转换也无济于事。 - zerkms
1个回答

25

ReadSeekStream类型的方法,不仅适用于FileStream。只是并非所有流都支持它们。(个人更喜欢使用Position属性而不是调用Seek,但它们归根结底是相同的。)

如果您希望将数据保存在内存中而不是转储到文件中,为什么不将其全部读入MemoryStream中呢?它支持寻址。例如:

public static MemoryStream CopyToMemory(Stream input)
{
    // It won't matter if we throw an exception during this method;
    // we don't *really* need to dispose of the MemoryStream, and the
    // caller should dispose of the input stream
    MemoryStream ret = new MemoryStream();

    byte[] buffer = new byte[8192];
    int bytesRead;
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        ret.Write(buffer, 0, bytesRead);
    }
    // Rewind ready for reading (typical scenario)
    ret.Position = 0;
    return ret;
}

使用:

using (Stream input = ...)
{
    using (Stream memory = CopyToMemory(input))
    {
        // Seek around in memory to your heart's content
    }
}

这类似于使用.NET 4中引入的Stream.CopyTo方法。如果您确实想要写入文件系统,您可以进行类似的操作,首先将内容写入文件,然后倒回流...但是之后您需要注意删除它,以避免在磁盘上留下垃圾文件。

您能否评论一下,如果我想使用 FileStream,这个示例会如何改变? - Josh Sharkey
@JoshSharkey:说实话,你的问题不太清楚。我建议你提出一个明确要求的新问题。 - Jon Skeet

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