Exemple #1
0
    //使用离散文件包接口,表示文件数据不一定非要连续,即通过位置和长度来确定,连续文件一般只有长度一个数值

    //在构造函数中填入文件包读取的部分,对每个文件需要调用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));
    }