我目前正在开发一个游戏,我想知道是否可以在C#中制作一个自定义文件打包程序/解包程序/修改器
它可以将整个目录中的所有文件(包括子目录)打包为具有自定义扩展名的单个文件,并且可以解压所有文件,但在打包时仍具有相同的信息,并修改打包文件中的文件。
我知道我的要求太多了,我不希望得到所有的答案,所以如果你至少知道一个,请告诉我,如果有链接的话请告诉我。
请和谢谢。
发布于 2013-03-30 20:12:20
要创建一个包文件,并能够读取它,您首先需要定义如何在该包文件中存储信息,因此您首先需要创建一个结构或类。
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打开该pack文件。
您需要打开您希望打包和迭代所有子目录和文件的目录树的根目录,并为找到的每个文件创建一个FileEntry并将其存储在列表中。接下来应该写入文件的是一个32位整数,它指定了包中文件的总数(列表的Count属性)。
然后,您可能希望迭代您的文件列表并编写另一个标记来指定文件开始,例如“FileEntry”,然后是FileSize的32位整数,Flags的32位整数,然后是FileName的字符串长度的32位it,因为FileName是动态的,可以是任何长度,然后写出FileName字符串本身,FileDirectory长度和FileDirectory字符串也是如此。在你写完FileDirectory字符串之后,你会想要自己写文件数据,注意这不会存储在文件条目中,因为你可能不希望所有这些数据都存储在内存中。
一旦您对FileEntry列表中的所有内容执行了此操作,您就可以关闭该文件,所有这些文件都将整齐地打包到一个自定义包文件中。
用于读取的
我们基本上会做同样的事情,但我们将读取,而不是写入,您将必须记录一个偏移值,以便您能够跟踪新文件的开始位置,以便您可以在以后读出其数据。
您首先需要读取文件的前4个字节,并测试它们是否设置为"PACK",如果设置为“PACK”,则可以继续,因为这是我们的文件。接下来,读入下一个4字节并转换为一个32位整数,这样我们就可以得到这个包中包含的文件总数。
然后,您可以运行一个for循环,在查找FileEntry时,记住每次通过StreamReader读取任何内容时,都要增加偏移量,这会让事情变得更简单,就像for(int i=0; i<g_max_files; i++)一样。我们在循环中检查的第一件事是文件输出匹配" file“后的前4个字节。如果它们匹配,我们就读出4字节(32位)的块,然后是FileSize,然后是Flags,然后是FileName的长度,一旦我们知道了FileName的长度,我们就可以读出FileName本身并用FileDirectory重复。如果您一直在增加前面指定的偏移量,那么您现在应该拥有这个特定文件的文件数据起始位置(以字节为单位),您现在可以创建一个新的FileEntry并设置所有属性,并将其添加到您的文件列表中,并允许循环继续返回到下一个文件。
修改的
通过修改,如果您要增加包中任何文件的文件大小,您将不得不重新创建包,如果您要减少任何文件的文件大小,您可以简单地更改FileSize int并使用null填充包中的现有文件数据。
如果您希望保持现有文件的原样,但只添加到末尾,则只需对读取和创建进行修改。您只需使用这个包的创建部分将其添加到已有的包的末尾,并更改文件顶部的总文件int。
希望这能对你有所帮助。
https://stackoverflow.com/questions/15717753
复制相似问题