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

时间:2013-03-30 10:59:15

标签: c# file customization file-extension packer

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

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

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

请和谢谢。

1 个答案:

答案 0 :(得分:2)

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

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位int,它指定包中的文件总数(列表的Count属性)。

然后,您需要遍历您的FileEntry列表并编写另一个标记以指定文件开头,例如“FILE”,然后是FileSize的32位int,Flags的32位int 1}},然后,字符串长度为FileName的32位为FileName是动态的,可以是任意长度,然后写出它自己的FileName字符串,以及与FileDirectory长度和FileDirectory字符串相同。在您编写了FileDirectory字符串之后,您会想要自己编写文件数据,请注意,这不存储在文件条目中,因为您可能不希望所有这些数据都存储在内存中。

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

阅读

我们基本上会做同样的事情,但我们会阅读,而不是写作,你必须记录一个偏移值,以便你能够跟踪新文件的开始位置,以便你可以读取它的数据以后出去。

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

然后你可以运行一个for循环,比如for(int i=0; i<g_max_files; i++),以便在我们查找FileEntry时更容易,每当我们通过StreamReader读取任何内容时,请记住增加偏移量。 1}}。我们在循环中检查的第一件事是文件输出匹配“FILE”后的前4个字节。如果它们匹配,那么我们知道FileSize的长度,然后以4字节(32位)块,Flags,然后FileName然后FileName的长度读出,我们可以读出FileName的自我并重复FileDirectory。如果您一直在增加前面指定的偏移量,那么现在应该具有文件位置(以字节为单位)为此特定文件启动文件数据的位置,您现在可以创建一个新的FileEntry并设置所有属性并添加它到你的文件列表,并允许循环继续回到下一个文件。

<强>修改

通过修改,如果要增加包中任何文件的文件大小,则必须重新创建包,如果要减小任何文件的文件大小,则可以只需更改FileSize int并使用null's填充包中的现有文件数据。

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

希望这有用。