如何在c#中将三个文件放在一个文件中

本文关键字:文件 一个 三个 | 更新日期: 2023-09-27 17:59:04

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

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

我怎么能做到这一点,并且以后还能把它们分开呢?

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

如何在c#中将三个文件放在一个文件中

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

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

这在很大程度上取决于你为什么要将它们分组。

压缩将花费时间和CPU功率。

我认为您应该考虑按照Erno的建议将资源嵌入程序集中。

但是,如果真的想将它们打包到一个文件中,只需在流本身之前写入每个流的长度即可。然后,您可以读取长度字节,然后将下一个字节作为流返回。下面用难看的方法阅读/写作。最终可以对目标流进行gzip封装。请注意,下面的天真方法将整个字符串读取并写入单个缓冲区,并假设没有文件大于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;
    }

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

不久前,我在这里遇到了一个类似的问题,关于在一个文件中保存两个XML文件。

用代码查看我的答案。

"我最终编写了自己的Stream,它可以被认为是一个多流。它允许你将一个流连续地视为多个流。也就是说,将多流传递给xml解析器(或其他任何东西),它会读到一个标记,上面写着‘这是流的结尾’。如果你将同一个流传递给另一个xml解析器,它会从该标记读取到下一个或EOF。"

你的基本用法是:

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