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); } }
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]; } } } }
internal ManifestDirectory(DirectoryMetaData meta, string fullName) { FullName = fullName; MetaData = meta; }