将多个文件流合并为一个文件?

时间:2015-02-09 18:09:51

标签: c# .net filestream binary-serialization

我有一个应用程序,我很快就会持续存储大量二进制数据。我目前有两个不同的数据通道可以独立增长,所以我使用两个文件存储它。但是,这两个文件彼此紧密耦合(ID引用只在另一个文件的上下文中有意义),因此出于传输和正确链接的目的,最好将它们作为单个存储/传输文件。

是否有一些标准方法,在操作系统级别或.NET BCL中构建两个可在同一基础文件中独立增长的FileStream对象?

我已经考虑过实现某种分块/分页方案了,但是我觉得这基本上复制了文件系统已经做的内容,所以我宁愿让文件系统管理它,如果可能的话

另一种方法是使用后处理工具在录制完成后合并这两个文件。这是可以管理的,但并不理想。

我也尝试过一些轻量级数据库选项,但事实证明它们对我正在做的事情来说太慢了。

这个问题的理想解决方案是在同一个文件中扩展到两个以上的数据流,尽管这两个数据流对我目前的用途来说已经足够了。

2 个答案:

答案 0 :(得分:3)

我只是去找一个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);
}

答案 1 :(得分:1)

如果您希望它看起来像单个文件,则可以使用NTFS备用数据流(NTFS Alternate Data Streams - .NET)。

请注意,许多工具会在文件操作期间忽略备用数据流,因此如果需要移动此类文件,请务必小心。