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); } } }
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)); } }