示例#1
0
        void ResolveDirectories(BinaryReaderX br, string currentPath = "")
        {
            var currentDirEntry = new DirectoryMetaData
            {
                parentDirOffset           = br.ReadInt32(),
                nextSiblingDirOffset      = br.ReadInt32(),
                firstChildDirOffset       = br.ReadInt32(),
                firstFileOffset           = br.ReadInt32(),
                nextDirInSameBucketOffset = br.ReadInt32(),
                nameLength = br.ReadInt32()
            };

            currentDirEntry.name = Encoding.Unicode.GetString(br.ReadBytes(currentDirEntry.nameLength));

            //first go through all sub dirs
            if (currentDirEntry.firstChildDirOffset != -1)
            {
                br.BaseStream.Position = lv3Offset + lv3Header.dirMetaTableOffset + currentDirEntry.firstChildDirOffset;
                ResolveDirectories(br, currentPath + currentDirEntry.name + "\\");
            }

            //then get all files of current dir
            if (currentDirEntry.firstFileOffset != -1)
            {
                br.BaseStream.Position = lv3Offset + lv3Header.fileMetaTableOffset + currentDirEntry.firstFileOffset;
                ResolveFiles(br, currentPath + currentDirEntry.name + "\\");
            }

            //finally move to next sibling dir
            if (currentDirEntry.nextSiblingDirOffset != -1)
            {
                br.BaseStream.Position = lv3Offset + lv3Header.dirMetaTableOffset + currentDirEntry.nextSiblingDirOffset;
                ResolveDirectories(br, currentPath);
            }
        }
示例#2
0
        public ReleaseManifest(string file)
        {
            using (var stream = File.OpenRead(file)) {
                stream.ReadStruct <ReleaseManifestHeader>();

                var directories = new DirectoryMetaData[stream.ReadStruct <int>()];
                for (var i = 0; i < directories.Length; i++)
                {
                    directories[i] = stream.ReadStruct <DirectoryMetaData>();
                }

                var files = new FileMetaData[stream.ReadStruct <int>()];
                for (var i = 0; i < files.Length; i++)
                {
                    files[i] = stream.ReadStruct <FileMetaData>();
                }

                strings = new string[stream.ReadStruct <int>()];
                stream.ReadStruct <int>();

                var build = new StringBuilder();
                for (int i = 0; i < strings.Length; i++)
                {
                    int c;
                    while ((c = stream.ReadByte()) > 0)
                    {
                        build.Append((char)c);
                    }
                    strings[i] = build.ToString();
                    build.Clear();
                }

                AllFiles = new Dictionary <string, ManifestFile>(files.Length);

                var manDirs  = directories.Select(d => new ManifestDirectory(d, strings[d.NameIndex])).ToArray();
                var manFiles = files.Select(d => new ManifestFile(d, strings[d.NameIndex])).ToArray();

                for (var i = 0; i < directories.Length; i++)
                {
                    int start = directories[i].FirstSubdirIndex;
                    if (start == i)
                    {
                        start++;
                    }

                    for (var j = 0; j < directories[i].SubdirCount; j++)
                    {
                        manDirs[start + j].LinkToParent(manDirs[i]);
                    }
                }

                for (var i = 0; i < directories.Length; i++)
                {
                    int start = directories[i].FirstFileIndex;

                    for (var j = 0; j < directories[i].FileCount; j++)
                    {
                        manFiles[start + j].LinkToParent(manDirs[i]);
                        AllFiles[manFiles[start + j].FullName] = manFiles[start + j];
                    }
                }
            }
        }
示例#3
0
 internal ManifestDirectory(DirectoryMetaData meta, string fullName)
 {
     FullName = fullName;
     MetaData = meta;
 }