【问题标题】:Combine multiple file streams into a single file?将多个文件流合并到一个文件中?
【发布时间】:2015-02-09 18:09:50
【问题描述】:

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

是否有某种标准方法,无论是在操作系统级别还是在 .NET BCL 中,都可以构造两个可以在同一个基础文件中独立增长的 FileStream 对象?

我考虑过实施某种分块/分页方案,但令我震惊的是,这基本上是在复制文件系统已经在后台所做的工作,所以如果可能的话,我宁愿让文件系统来管理它.

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

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

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

【问题讨论】:

  • 你在最终文件中需要任何类型的结构吗,我的意思是,一旦你关闭了两个流,除了你的程序之外,你还需要其他任何东西,你可以改变它以适应文件格式,打开文件?假设你最终得到了块 1 + 块 2,一个有效的存储可能类似于一个 zip 文件,还是你需要它们在最终文件中是逐字节的,首先是块 1,然后是块 2。
  • 这应该如何工作?写入单个文件的新字节在哪里?一些分页?
  • COM Structured Storage - 我在我的一个产品中使用它来将多个相互关联的数据流存储到一个物理文件中。不过,这是一种过时的技术,在 C# 中使用可能有点尴尬。我不确定是否有基于 .NET 的等价物。
  • @LasseV.Karlsen,我的结构很灵活,只有我的程序需要打开文件。这两个文件目前都使用 Protobuf.net 格式化以序列化一系列二进制记录,前面是带有一些版本信息的标头记录。
  • 我也打算建议查看结构化存储,并分享相同的想法,即它既过时又可能没有良好的 .NET 实现。我看了一些,但没有找到任何看起来不错的实现。

标签: c# .net filestream binary-serialization


【解决方案1】:

我只需要一个 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);
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      相关资源
      最近更新 更多