Exemple #1
0
        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!");
        }
Exemple #2
0
        /// <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...");
            }
        }