2015-02-09 208 views
2

我有一个应用程序,我很快就坚持大量的二进制数据。我目前有两个不同的数据通道可以独立增长,所以我使用两个文件来存储这个通道。然而,这两个文件彼此紧密耦合(在另一个文件的上下文中仅有意义的ID参考),所以为了传输和适当的连接,将它们作为单个存储/传输文件。将多个文件流合并成一个文件?

有没有一些标准的方式,无论是在操作系统级别还是在.NET BCL中构建两个可以在同一底层文件内独立增长的FileStream对象?

我已经考虑实现某种分块/分页方案,但它让我感到基本上重复了文件系统已经在底层做了什么,所以我宁愿让文件系统管理它,如果它是可能。

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

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

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

+0

你需要的任何类型的结构在最终文件中,我的意思是一旦你关闭了两个流,你需要什么,但你的程序,你可以改变以适应文件格式,打开文件?假设你最终得到了块1 +块2,一个有效的存储可以类似于一个zip文件,或者你需要它们在最终文件中是第一个块1,然后是第二块的字节到字节。 – 2015-02-09 18:15:51

+0

应该怎么做那工作?新字节写入单个文件的位置在哪里?一些分页? – DrKoch 2015-02-09 18:16:18

+0

有[COM结构化存储](http://en.wikipedia.org/wiki/COM_Structured_Storage) - 我在其中一个产品中使用它来将多个相互关联的数据流存储到单个物理文件中。尽管这有些过时的技术,但从C#中使用可能有些尴尬。我不确定是否有基于.NET的对等项。 – 2015-02-09 18:17:44

回答

1

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

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

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); 
}