如何在c#中将三个文件合并为一个?

时间:2011-06-14 20:13:15

标签: c# .net file compression

我正在尝试为我计划制作的游戏制作地图。地图应该有两个数据文件和一个图片文件。

我想将它们放在一起,形成一个文件,我只想使用默认的库。

我怎么能这样做,以后能够将它们分开?

解决方案是压缩,但我找不到使用gzipstreamer类压缩多个文件的方法。

5 个答案:

答案 0 :(得分:1)

您可以使用SharpZipLib创建ZIP文件。

答案 1 :(得分:1)

您是否考虑将文件作为资源嵌入到程序集中(或在单独的程序集中?)

很大程度上取决于你想要将它们分组的原因。

压缩会耗费时间和CPU能力。

答案 2 :(得分:0)

Gzip压缩仅适用于一个文件(它只有)。您可以尝试ZIP,7-ZIP或其他允许多个文件的存档格式。或者你可以先将文件一起TAR,这是Gzip被发明替代的压缩方案的常见做法。

答案 3 :(得分:0)

前一段时间我有一个类比问题here关于在一个文件中保存2个XML文件。

使用代码查看我的answer

“我最终编写了自己的Stream,可以将其视为多流。它允许您将一个流连续处理为多个流。即将多流传递给xml解析器(或其他任何东西)然后它会读到一个标记,上面写着'这是流的结尾'。如果你然后将同一个流传递给另一个xml解析器,它将从该标记读取到下一个或EOF“< / em>的

您的基本用法是:

Writing:
    Open File Stream
    Create MultiStream passing in File Stream in constructor
    Write data file to multistream
    Call write end of stream marker on multistream
    Write 2nd data file to multistream
    Call write end of stream marker on multistream
    Save picture to multistream
    Close multistream
    Close file stream

Reading:
    Open File Stream
    Create MultiStream passing in File Stream in constructor
    Read data file
    Call advance to next stream on multistream
    Read 2nd data file
    Call advance to next stream on multistream
    Read image (Image.FromStream() etc.)
    Close multistream
    Close file stream

答案 4 :(得分:0)

我认为你应该考虑在Erno建议中将资源嵌入到程序集中。

但是如果确实希望将它们打包到一个文件中,您可以通过在流本身之前编写每个流的长度来实现。然后,您可以读取 length 字节,然后将下一个 length 字节作为Stream返回。下面用丑陋的方法读/写。目标流最终可以被gzip压缩。请注意,下面的naive方法读取并将整个字符串写入单个缓冲区,并假定没有文件大于int.MaxValue。

但我不建议只使用标准库。

    static void Append(Stream source, Stream target)
    {
        BinaryWriter writer = new BinaryWriter(target);
        BinaryReader reader = new BinaryReader(source);  
        writer.Write((long)source.Length);
        byte[] buffer = new byte[1024];
        int read;
        do
        {
            read = reader.Read(buffer, 0, buffer.Length);
            writer.Write(buffer, 0, read);
        }
        while (read > 0);
        writer.Flush();
    }

    static Stream ReadNextStream(Stream packed)
    {
        BinaryReader reader = new BinaryReader(packed);
        int streamLength = (int)reader.ReadInt64();

        MemoryStream result = new MemoryStream();
        byte[] buffer = new byte[streamLength];
        reader.Read(buffer, 0, buffer.Length);

        BinaryWriter writer = new BinaryWriter(result);
        writer.Write(buffer, 0, buffer.Length);
        writer.Flush();

        result.Seek(0, SeekOrigin.Begin);
        return result;
    }