将多个文件流组合成一个文件?
Combine multiple file streams into a single file?
我有一个应用程序,我可以相当快地持久化大量二进制数据。我目前有两个不同的数据通道,它们的大小可以独立增长,所以我使用两个文件存储它。但是,这两个文件彼此紧密耦合(ID 引用仅在另一个文件的上下文中才有意义),因此为了传输和正确链接的目的,最好将它们 store/transport 作为单个文件。
是否有一些标准方法,在 OS 级别或在 .NET BCL 中构造两个可以在同一基础文件中独立增长的 FileStream 对象?
我考虑过实施某种 chunking/paging 方案,但令我吃惊的是,这基本上是在复制文件系统已经在后台执行的操作,所以我宁愿让文件系统管理它, 如果可能的话。
另一种方法是在录制完成后使用post-处理工具合并两个文件。这是可控的,但并不理想。
我也尝试过一些轻量级数据库选项,但事实证明它们对于我正在做的事情来说太慢了。
这个问题的理想解决方案是在同一文件中扩展到两个以上的数据流,尽管两个就足以满足我目前的目的。
如果您只是想让它看起来像单个文件,您可以使用 NTFS 备用数据流 (NTFS Alternate Data Streams - .NET)。
请注意,许多工具在文件操作期间会忽略备用数据流,因此如果您需要移动此类文件,请务必小心。
我只需要一个 zip 文件。 Ionic dotnetzip 与流一起工作得很好,因此您最终不必将它们加载到内存中(我们使用这种技术来压缩巨大的有效负载而不会关闭服务器):
using(var z = new ZipFile())
{
z.AddEntry("file1", (name, stream) =>
{
someSourceStream1.CopyTo(stream);
});
z.AddEntry("file2", (name, stream) =>
{
someSourceStream2.CopyTo(stream);
});
z.Save(@"some\path.zip");
//or
//z.Save(someOutputStream);
}
我有一个应用程序,我可以相当快地持久化大量二进制数据。我目前有两个不同的数据通道,它们的大小可以独立增长,所以我使用两个文件存储它。但是,这两个文件彼此紧密耦合(ID 引用仅在另一个文件的上下文中才有意义),因此为了传输和正确链接的目的,最好将它们 store/transport 作为单个文件。
是否有一些标准方法,在 OS 级别或在 .NET BCL 中构造两个可以在同一基础文件中独立增长的 FileStream 对象?
我考虑过实施某种 chunking/paging 方案,但令我吃惊的是,这基本上是在复制文件系统已经在后台执行的操作,所以我宁愿让文件系统管理它, 如果可能的话。
另一种方法是在录制完成后使用post-处理工具合并两个文件。这是可控的,但并不理想。
我也尝试过一些轻量级数据库选项,但事实证明它们对于我正在做的事情来说太慢了。
这个问题的理想解决方案是在同一文件中扩展到两个以上的数据流,尽管两个就足以满足我目前的目的。
如果您只是想让它看起来像单个文件,您可以使用 NTFS 备用数据流 (NTFS Alternate Data Streams - .NET)。
请注意,许多工具在文件操作期间会忽略备用数据流,因此如果您需要移动此类文件,请务必小心。
我只需要一个 zip 文件。 Ionic dotnetzip 与流一起工作得很好,因此您最终不必将它们加载到内存中(我们使用这种技术来压缩巨大的有效负载而不会关闭服务器):
using(var z = new ZipFile())
{
z.AddEntry("file1", (name, stream) =>
{
someSourceStream1.CopyTo(stream);
});
z.AddEntry("file2", (name, stream) =>
{
someSourceStream2.CopyTo(stream);
});
z.Save(@"some\path.zip");
//or
//z.Save(someOutputStream);
}