public static void Main(string[] args) { var showHelp = false; var options = new OptionSet() { { "h|help", "show this message and exit", v => showHelp = v != null }, }; List <string> extras; try { extras = options.Parse(args); } catch (OptionException e) { Console.Write("{0}: ", GetExecutableName()); Console.WriteLine(e.Message); Console.WriteLine("Try `{0} --help' for more information.", GetExecutableName()); return; } if (extras.Count < 1 || extras.Count > 2 || showHelp == true) { Console.WriteLine("Usage: {0} [OPTIONS]+ input.toc_group [output_dir]", GetExecutableName()); Console.WriteLine(); Console.WriteLine("Options:"); options.WriteOptionDescriptions(Console.Out); return; } var inputPath = Path.GetFullPath(extras[0]); var outputBasePath = extras.Count > 1 ? extras[1] : Path.ChangeExtension(inputPath, null) + "_unpack"; FileFormats.TableOfContentsGroupFile toc; using (var input = File.OpenRead(inputPath)) { toc = new FileFormats.TableOfContentsGroupFile(); toc.Deserialize(input, Endian.Little); } if (toc.InternalEntries.Count == 0) { return; } var inputBasePath = inputPath; string inputDataPath = null; while (inputBasePath != null) { inputBasePath = Path.GetDirectoryName(inputBasePath); var candidatePath = Path.Combine(inputBasePath ?? "", toc.InternalDataPath); if (File.Exists(candidatePath) == true) { inputDataPath = candidatePath; break; } } if (inputDataPath == null) { Console.WriteLine("Could not find packfile."); return; } using (var input = File.OpenRead(inputDataPath)) { foreach (var entry in toc.InternalEntries) { var outputPath = Path.Combine(outputBasePath, entry.Name); var outputParentPath = Path.GetDirectoryName(outputPath); if (string.IsNullOrEmpty(outputParentPath) == false) { Directory.CreateDirectory(outputParentPath); } using (var output = File.Create(outputPath)) { input.Position = entry.Offset; output.WriteFromStream(input, entry.Size); } } } }
public static void Main(string[] args) { var showHelp = false; var dataPath = "pc_media"; var options = new OptionSet() { { "d|data-path=", "set data path", v => dataPath = v }, { "h|help", "show this message and exit", v => showHelp = v != null }, }; List <string> extras; try { extras = options.Parse(args); } catch (OptionException e) { Console.Write("{0}: ", GetExecutableName()); Console.WriteLine(e.Message); Console.WriteLine("Try `{0} --help' for more information.", GetExecutableName()); return; } if (extras.Count < 1 || extras.Count > 2 || showHelp == true) { Console.WriteLine("Usage: {0} [OPTIONS]+ input.toc_group [output.toc_group]", GetExecutableName()); Console.WriteLine(); Console.WriteLine("Options:"); options.WriteOptionDescriptions(Console.Out); return; } var inputPath = Path.GetFullPath(extras[0]); var outputPath = extras.Count > 1 ? extras[1] : Path.ChangeExtension(inputPath, null) + "_convert.toc_group"; FileFormats.TableOfContentsGroupFile toc; using (var input = File.OpenRead(inputPath)) { toc = new FileFormats.TableOfContentsGroupFile(); toc.Deserialize(input, Endian.Little); } foreach (var entry in toc.InternalEntries) { toc.ExternalEntries.Add(new FileFormats.TableOfContentsGroupFile.ExternalEntry() { Name = entry.Name, Size = entry.Size, Path = Path.Combine(dataPath, entry.Name) }); } toc.InternalPriority = 0; toc.InternalDataPath = null; toc.InternalEntries.Clear(); using (var output = File.Create(outputPath)) { toc.Serialize(output, Endian.Little); } }