Exemple #1
0
        private static void DoExtract(CpkContainer cpk, string outdir, bool recursive)
        {
            for (long i = 0; i < cpk.toc_entries; ++i)
            {
                CpkContainer.Entry entry = cpk.GetEntryByIndex(i);
                if (entry == null)
                {
                    continue;
                }

                string name = entry.name;
                if (recursive && name.ToLowerInvariant().EndsWith(".cpk"))
                {
                    CpkContainer subcpk;
                    if (entry.compressed)
                    {
                        subcpk = new CpkContainer(cpk.GetChildByIndex(i).AsFile.DataStream);
                    }
                    else
                    {
                        subcpk = new CpkContainer(cpk.DuplicateStream(), entry.file_offset);
                    }
                    DoExtract(subcpk, Path.Combine(outdir, name + ".ext"), recursive);
                    continue;
                }

                string outpath = Path.Combine(outdir, name);
                Console.WriteLine("Extracting {0}...", outpath);
                Directory.CreateDirectory(Path.GetDirectoryName(outpath));
                using (var ds = cpk.GetChildByIndex(i).AsFile.DataStream)
                    using (FileStream fs = new FileStream(outpath, FileMode.Create, FileAccess.Write)) {
                        StreamUtils.CopyStream(ds, fs, ds.Length);
                    }
            }
        }
Exemple #2
0
 private static HyoutaPluginBase.DuplicatableStream GetFile(CpkContainer cpk, long index, bool decompress)
 {
     if (decompress)
     {
         return(cpk.GetChildByIndex(index).AsFile.DataStream);
     }
     else
     {
         var entry = cpk.GetEntryByIndex(index);
         return(new HyoutaUtils.Streams.PartialStream(cpk.DuplicateStream(), entry.file_offset, entry.file_size));
     }
 }