private static void ExtractPackage() { PakReader reader = null; try { reader = new PakReader(_pakFile); } catch (FileNotFoundException e) { _hasErrored = true; Console.Error.WriteLine(e.Message); Console.Error.WriteLine("File: '{0}'", e.FileName); } PakFile file = null; try { file = reader.Read(); } catch (PakReaderException e) { _hasErrored = true; Console.Error.WriteLine(e.Message); Console.Error.WriteLine("Reason: {0}", e.InnerException.Message); return; } if (_outputDir == "") { _outputDir = Path.GetDirectoryName(_pakFile); } for (int i = 0; i < file.Entries.Count; i++) { var entry = file.Entries[i]; entry.Extract(_outputDir); Console.WriteLine("[{0}/{1}] Extracted {2}", i + 1, file.Entries.Count, entry.ArchivePath); Thread.Sleep(10); } Console.WriteLine("Extracted all files successfully!"); }
/// <summary> /// Fetches all items in the given pak. /// </summary> /// <param name="pakPath">File path to pak.</param> public void Fetch(string pakPath) { using (FileStream fs = File.Open(pakPath, FileMode.Open)) using (BinaryReader binaryReader = new BinaryReader(fs)) { PakReader reader = new PakReader(); PakData pak = reader.Read(binaryReader); foreach (PakItem item in pak.Items) { string ext = Path.GetExtension(item.Path); if (Extensions == null || Extensions.Count == 0 || ext.Length > 0 && Extensions.Contains(ext.Substring(1).ToLowerInvariant())) { byte[] data = PakReader.ReadItem(binaryReader, item); string s = Encoding.UTF8.GetString(data); OnItemFound?.Invoke(item.Path, s); } } } }
private static void Run(Options options) { var inp = options.InputPath; var outp = options.OutputPath; var save = !string.IsNullOrWhiteSpace(outp) && Directory.Exists(outp); var pat = options.Pattern; var isDirectory = Directory.Exists(inp); Console.WriteLine("Starbound - Asset Search"); Console.Write("- "); Console.Write($"{(isDirectory ? "Directory" : "File")}: ".PadLeft(11)); WriteColoredLine(ConsoleColor.Cyan, inp); Console.Write("- "); Console.Write("Pattern: ".PadLeft(11)); WriteColoredLine(ConsoleColor.Cyan, pat); if (save) { Console.Write("- "); Console.Write("Output: ".PadLeft(11)); WriteColoredLine(ConsoleColor.Cyan, outp); } Console.WriteLine("Starting search..."); // Get files var files = isDirectory ? GetPaks(options.InputPath) : File.Exists(inp) ? new[] { options.InputPath } : null; if (!(files?.Length > 0)) { Wait("No file(s) found."); return; } if (string.IsNullOrEmpty(pat)) { pat = "*"; } else if (!pat.Contains("/")) { pat = $"*/{pat}"; } pat = $"^{pat}$"; var pattern = new Regex(pat.Replace(".", "\\.").Replace('?', '.').Replace("*", ".*")); var reader = new PakReader(); // Scan files foreach (var file in files) { var fileName = Path.GetFileNameWithoutExtension(file); WriteColoredLine(ConsoleColor.Yellow, $"{file}"); using (var fs = File.Open(file, FileMode.Open)) using (var binaryReader = new BinaryReader(fs)) { var pak = reader.Read(binaryReader); foreach (var item in pak.Items) { if (!pattern.IsMatch(item.Path)) { continue; } Console.WriteLine($"- {item.Path}"); if (save) { SaveFile(binaryReader, outp, fileName, item); } } ; } //if (save) //WriteColoredLine(); } if (options.KeepOpen) { Wait("Press any key to exit..."); } }