static void Unpack(PackerSettings settings) { Console.WriteLine("-- Unpack Files in " + settings.target + " --"); FileStream stream = new FileStream(settings.target, FileMode.Open); BinaryReader r = new BinaryReader(stream); DiskArchiveHeader header = new DiskArchiveHeader(); header.Read(r); if (header.HasValidMagicValue() == false) { Console.WriteLine("Error: " + settings.target + " is not a P.A.C.K file"); return; } Console.WriteLine("Files: " + header.numFiles); Console.WriteLine("Manifest position: " + header.fileListOffset); string outputDir = "output\\" + Path.GetFileNameWithoutExtension(settings.target); Console.WriteLine("Writing contents to " + outputDir); Directory.CreateDirectory(outputDir); r.BaseStream.Seek(header.fileListOffset, SeekOrigin.Begin); for (int i = 0; i < header.numFiles; ++i) { DiskArchiveFile file = new DiskArchiveFile(); uint manifestReadPosition = file.Read(r); r.BaseStream.Seek(file.offset, SeekOrigin.Begin); byte[] bytes = r.ReadBytes((int)file.numBytes); // remember seek back to manifest position r.BaseStream.Seek(manifestReadPosition, SeekOrigin.Begin); string fileName = outputDir + file.fileName.Trim('\0'); Console.WriteLine("Writing " + fileName + ": Size: " + bytes.Length); // Make sure directory exists Directory.CreateDirectory(Path.GetDirectoryName(fileName)); File.WriteAllBytes(fileName, bytes); } }
static void ListContents(PackerSettings settings) { Console.WriteLine("-- List Files in " + settings.target + " --"); FileStream stream = new FileStream(settings.target, FileMode.Open); BinaryReader r = new BinaryReader(stream); DiskArchiveHeader header = new DiskArchiveHeader(); header.Read(r); if (header.HasValidMagicValue() == false) { Console.WriteLine("Error: " + settings.target + " is not a P.A.C.K file"); return; } Console.WriteLine("Files: " + header.numFiles); Console.WriteLine("Manifest position: " + header.fileListOffset); r.BaseStream.Seek(header.fileListOffset, SeekOrigin.Begin); for (int i = 0; i < header.numFiles; ++i) { DiskArchiveFile file = new DiskArchiveFile(); file.Read(r); Console.WriteLine(file.fileName + ": Size: " + file.numBytes + " offset: " + file.offset + " type: " + file.info[0]); } }