我正在开发游戏,我想知道是否可以在C#中制作自定义文件打包器/解包器/修改器
它可以打包整个目录中的所有文件,包括带有自定义扩展名的单个文件中的子目录,它可以解压缩所有文件,但在打包时仍然具有相同的信息,并修改打包内的文件文件。
我知道我要求很多,而且我不希望得到所有的答案,所以如果你至少知道一个,请告诉我,或者如果有的话,请指导我一个链接。
请和谢谢。
答案 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。
希望这有用。