c# - 是否有一种内置方法可以将多个文件作为一个流处理?

标签 c# .net

我有一个文件列表,我需要按特定顺序将它们读入给定大小的 byte[] 中。这本身对于单个文件来说不是问题,一个简单的 while ((got = fs.Read(piece, 0, pieceLength)) > 0) 就可以完美地完成工作。文件的最后一部分可能比预期的要小,这没关系。

现在,有一个棘手的问题:如果我有多个文件,我需要有一个连续的流,这意味着如果文件的最后一段小于 pieceLength,那么我需要读取 (pieceLength-got)下一个文件,然后继续执行直到最后一个文件结束。

所以基本上,给定 X 个文件,我将始终读取恰好 pieceLength 长的片段,除了最后一个文件的最后一段,它可能更小。

我只是想知道是否已经在 .net (3.5 SP1) 中构建了一些可以解决问题的东西。我目前的方法是创建一个类,它接受一个文件列表,然后公开一个 Read(byte[] buffer, long index, long length) 函数,类似于 FileStream.Read()。这应该非常简单,因为我不必更改读取数据的调用代码,但在我重新发明轮子之前,我想仔细检查轮子是否尚未内置到 BCL 中。

谢谢:)

最佳答案

我不相信框架中有任何东西,但我建议让它更灵活一些 - 采用 IEnumerable<Stream>在你的构造函数中,并从 Stream 派生你自己。然后要获取文件流,您可以(假设是 C# 3.0)执行以下操作:

Stream combined = new CombinationStream(files.Select(file => File.Open(file));

“所有权”部分在这里有点棘手 - 上面的内容允许组合流取得它从中读取的任何流的所有权,但您可能不希望它必须遍历所有其余流并在过早关闭时将它们全部关闭。

关于c# - 是否有一种内置方法可以将多个文件作为一个流处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/533881/

相关文章:

.net - 将 VS 2008 中的测试项目转换为 2010

c# - 如何在动态生成的C#代码中初始化各种类型变量?

.net - 如何使 WCF 服务 channel 进入故障状态?

c# - 如何编写一个接受数据行并填充对象属性的通用函数?

C# 无法将 bool 转换为 int

c# - 在 C# 代码的开头和之后更改标签的文本

c# - 创建自定义文本编辑控件

c# - AutoMapper:领域模型和 View 模型之间的双向深度映射

c# - WPF按钮单击和命令不能一起工作MVVM

c# - 如何在 C# 中将字典初始化为 (key, value, value) 对