//使用离散文件包接口,表示文件数据不一定非要连续,即通过位置和长度来确定,连续文件一般只有长度一个数值 //在构造函数中填入文件包读取的部分,对每个文件需要调用PushFile以构造路径信息和各种映射信息 public DAT(ZeroPositionStreamPasser sp) : base(sp) { var s = sp.GetStream(); //判断文件头部是否正常 if (s.ReadSimpleString(12) != "NISPACK") { throw new InvalidDataException(); } var NumFile = s.ReadInt32(); RootValue = FileDB.CreateDirectory("", ""); for (var n = 0; n < NumFile; n += 1) { //读取索引的各部分 var Name = s.ReadSimpleString(32); var Address = s.ReadInt32(); var Length = s.ReadInt32(); var Unknown = s.ReadInt32(); //创建一个文件描述信息,包括文件名、文件大小、文件地址 var f = new FileDB(Name, FileDB.FileType.File, Length, Address, null); //将文件描述信息传递到框架内部 //框架内部能够自动创建文件树(将文件名中以'\'或者'/'表示的文件路径拆开) //框架内部能够自动创建IndexOfFile映射表,能够将文件描述信息映射到文件索引的出现顺序 //框架内部还记录一些数据用于寻找能放下数据的空洞 PushFile(f); } //离散文件在打开的时候应该寻找空洞,以供导入文件使用 //寻找的起始地址是从当前位置的下一个块开始的位置 ScanHoles(GetSpace(s.Position)); }