gpt4 book ai didi

c# - 是否可以制作自定义文件打包器/解包器/修改器?

转载 作者:太空宇宙 更新时间:2023-11-03 11:06:21 25 4
gpt4 key购买 nike

我目前正在开发一款游戏,我想知道是否可以在 C# 中制作自定义文件打包器/解包器/修改器

它可以将整个目录中的所有文件(包括子目录)打包到具有自定义扩展名的单个文件中,并且它可以解压所有文件但在打包时仍然具有相同的信息,并修改打包后的文件文件。

我知道我的要求很多,我不希望得到所有答案,所以如果您至少知道一个,请告诉我,或者如果有的话,请直接给我一个链接。

谢谢你。

最佳答案

要创建一个包文件并能够从中读取,您首先需要定义如何在该包文件中存储信息,因此您首先需要创建一个结构或类。

class FileEntry
{
public int FileOffset { get; set; }
public int FileSize { get; set; }
public int Flags { get; set; }
public String FileName { get; set; }
public String FileDirectory { get; set; }
}

用于创建

您最好标记您的文件,以便您可以验证它是正确的文件类型,即。将前 4 个字节设置为类似“PACK”的内容(您应该使用 StreamWriter 打开包文件。

您需要打开您希望打包的目录树的根目录并遍历所有子目录和文件,并为找到的每个文件创建一个 FileEntry并将其存储在列表中。接下来您应该写入文件的是一个 32 位整数,它指定包中的文件总数(列表的 Count 属性)。

然后您可能想要遍历 FileEntry 列表并写另一个标签来指定文件开始,例如“FILE”,然后是FileSize的32位整数。 , Flags 的 32 位整数,然后是FileName的字符串长度的32位它作为FileName是动态的,可以是任意长度,然后写出 FileName string its self,与FileDirectory相同长度和 FileDirectory字符串。在你写完 FileDirectory 之后string,然后你会想要自己写入文件数据,请注意,这不会存储在文件条目中,因为你可能不希望所有这些数据都存储在内存中。

一旦您对 FileEntry 中的所有内容都完成了该操作列表,然后您可以关闭该文件,这将把所有这些文件整齐地打包到一个自定义包文件中。

阅读用

我们基本上会做同样的事情,但我们将读取而不是写入,并且您将必须记录一个偏移值,以便您能够跟踪新文件的开始位置,以便您可以读取其数据稍后出来。

您首先需要读取文件的前 4 个字节并测试它们是否设置为“PACK”,如果是,我们可以继续,因为这是我们的文件。接下来,读入接下来的 4 个字节并转换为一个 32 位整数,这样我们就可以得到这个包中包含的文件总数。

然后您可以运行一个 for 循环,类似于 for(int i=0; i<g_max_files; i++)在我们寻找我们的 FileEntry 时让事情变得更容易的,记住每次我们通过 StreamReader 读取任何内容时增加我们的偏移量.我们在循环中检查的第一件事是文件输出匹配“FILE”后的前 4 个字节。如果它们匹配,我们然后以 4 字节(32 位) block 读出,FileSize , 然后 Flags然后 FileName的长度,一旦我们知道FileName的长度,我们可以读出FileName它自己并用 FileDirectory 重复.如果您一直在增加之前指定的偏移量,那么您现在应该拥有该特定文件的文件数据开始位置的文件位置(以字节为单位),您现在可以创建一个新的 FileEntry并设置所有属性并将其添加到您的文件列表中,并允许循环继续返回到下一个文件。

修改

通过修改,如果您要增加包中任何文件的文件大小,您将不得不重新创建包,如果您要减少任何文件的文件大小,您可以只需更改 FileSize int 并用 null 填充包中的现有文件数据。

如果您希望保留现有文件,但只添加到末尾,那么您只是在对读取和创建进行修改。您只需使用它的创建部分添加到您已有的包的末尾,并更改文件顶部的总文件数 int。

希望这对您有所帮助。

关于c# - 是否可以制作自定义文件打包器/解包器/修改器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15717753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com