private Archive.DirectoryEntry ReadDirectoryEntry(BinaryReader br) { Archive.DirectoryEntry directoryEntry = new Archive.DirectoryEntry(); directoryEntry.nameOffset = br.ReadUInt32(); directoryEntry.nextBlock = br.ReadUInt32(); return(directoryEntry); }
private Archive.FolderBlock ReadBlock(int blockNumber, string currentDir, BinaryReader br) { br.BaseStream.Seek((long)packBlockHeaders[blockNumber].blockOffset, SeekOrigin.Begin); Archive.FolderBlock folderBlock = new Archive.FolderBlock(); folderBlock.numSubdirectories = br.ReadUInt32(); folderBlock.numFiles = br.ReadUInt32(); if (folderBlock.numSubdirectories > 0) { Archive.DirectoryEntry[] directoryEntries = new Archive.DirectoryEntry[folderBlock.numSubdirectories]; for (int i = 0; i < folderBlock.numSubdirectories; i++) { directoryEntries[i] = ReadDirectoryEntry(br); } folderBlock.subDirectories = directoryEntries; } if (folderBlock.numFiles > 0) { Archive.FileEntry[] fileEntries = new Archive.FileEntry[folderBlock.numFiles]; for (int i = 0; i < folderBlock.numFiles; i++) { fileEntries[i] = ReadFileEntry(br); } folderBlock.files = fileEntries; } long remainingSize = (long)packBlockHeaders[blockNumber].blockSize - (br.BaseStream.Position - (long)packBlockHeaders[blockNumber].blockOffset); char[] nameslist = new char[remainingSize]; for (int i = 0; i < remainingSize; i++) { nameslist[i] = br.ReadChar(); } folderBlock.names = nameslist; if (folderBlock.subDirectories != null) { foreach (Archive.DirectoryEntry directoryEntry in folderBlock.subDirectories) { string word = ""; int increment = 0; for (int t = 0; t < 200; t++) { char c = folderBlock.names[directoryEntry.nameOffset + increment]; increment++; if (c != '\0') { word += c; } else { break; } } Archive.FolderBlock fB = ReadBlock((int)directoryEntry.nextBlock, currentDir + "\\" + word, br); DataManager.DirectoryTree.Add(currentDir + "\\" + word, fB); } } //long currentStreamPosition = br.BaseStream.Position; if (folderBlock.files != null) { foreach (Archive.FileEntry fileEntry in folderBlock.files) { //br.BaseStream.Seek(fileEntry.nameOffset, SeekOrigin.Begin); string word = ""; int increment = 0; for (int t = 0; t < 200; t++) { char c = folderBlock.names[fileEntry.nameOffset + increment]; //br.ReadChar(); increment++; if (c != '\0') { word += c; } else { break; } } //DataManager.FileNames.Add(fileEntry.nameOffset, word); string hash = DataManager.ToHex(fileEntry.hash); if (!DataManager.FileNames.ContainsKey(hash)) { DataManager.FileNames.Add(hash, word); } //else //Console.Log(DataManager.FileNames[fileEntry.nameOffset] + " " + word); DataManager.fileList.Add(currentDir + "\\" + word, fileEntry); } } //br.BaseStream.Seek(currentStreamPosition, SeekOrigin.Begin); return(folderBlock); }