public void MapFile() { _directories.Clear(); _files.Clear(); using (BinaryReader binReader = new BinaryReader(_fileStream, new UTF8Encoding(), true)) { binReader.BaseStream.Seek(0, SeekOrigin.Begin); while (_fileLength != binReader.BaseStream.Position) { long fileOffset = binReader.BaseStream.Position; long dataOffset = fileOffset + SizeOfHeader; ParseHeaderData(binReader, SizeOfHeader, out PackType packType, out uint dataLength); switch (packType) { case PackType.PDir: ParsePDir(binReader, dataLength, fileOffset, dataOffset); break; case PackType.File: ParseFilePointer(binReader, dataLength, fileOffset, dataOffset); break; default: binReader.SkipBytes(dataLength - SizeOfHeader); break; } } } _root = GetTreeWithRoot(); }
public static void PrintTree(FileDirectoryTree root, int dep) { sb.AppendFormat("{0}>{1}\n", new string('\t', dep), root.DirectoryName); foreach (FilePointer filePointer in root.Files) { sb.AppendFormat("{0}{1}\n", new string('\t', dep + 1), filePointer.Name); } foreach (FileDirectoryTree item in root.Directories) { PrintTree(item, dep + 1); } }
public static void UnpackAll(FileDirectoryTree root, string path) { foreach (FilePointer filePointer in root.Files) { if (!filePointer.Name.EndsWith(".dat")) { continue; } var buf = kk.GetFileContentBytes(filePointer); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } File.WriteAllBytes(path + "/" + filePointer.Name, buf); } foreach (FileDirectoryTree item in root.Directories) { UnpackAll(item, path + "/" + item.DirectoryName); } }