private void _Unpack(string path) { string dir = $"{path}.files"; if (Directory.Exists(dir)) { form.UpdateProgress(form.Controls["lblProgress"], "Removing Existing Directory"); Directory.Delete(dir, true); } Directory.CreateDirectory(dir); PCKStream stream = new PCKStream(path); stream.Seek(-4, SeekOrigin.End); version = stream.ReadInt16(); events = new CountdownEvent(GetFilesCount(stream)); IEnumerator <PCKFileEntry> enumerator; //Select wich version to read if (version == 3) { enumerator = ReadFileV3(stream).GetEnumerator(); } else { enumerator = ReadFileV2(stream).GetEnumerator(); } while (enumerator.MoveNext()) { string p = Path.Combine(dir, Path.GetDirectoryName(enumerator.Current.Path)); if (!Directory.Exists(p)) { Directory.CreateDirectory(p); } form.UpdateProgress(form.Controls["lblProgress"], $"Unpacking " + $"{(form.Controls["progBar"] as ProgressBar).Value}" + $"/{(form.Controls["progBar"] as ProgressBar).Maximum}: " + $"{ enumerator.Current.Path }"); stream.Seek(enumerator.Current.Offset, SeekOrigin.Begin); byte[] file = stream.ReadBytes(enumerator.Current.CompressedSize); ThreadPool.QueueUserWorkItem(x => { byte[] buffer = (x as object[])[0] as byte[]; PCKFileEntry entry = (x as object[])[1] as PCKFileEntry; File.WriteAllBytes(Path.Combine(dir, entry.Path), buffer.Length < entry.Size ? PCKZlib.Decompress(buffer, entry.Size) : buffer); events.Signal(); }, new object[] { file, enumerator.Current }); form.UpdateProgressBar(form.Controls["progBar"], "value", ((ProgressBar)form.Controls["progBar"]).Value + 1); } form.UpdateProgress(form.Controls["lblProgress"], "WaitThreads"); events.Wait(); stream.Dispose(); form.UpdateProgressBar(form.Controls["progBar"], "value", 0); form.UpdateProgress(form.Controls["lblProgress"], "Ready"); }
public IEnumerable <PCKFileEntry> ReadFileV3(PCKStream stream) { stream.Seek(-8, SeekOrigin.End); int FilesCount = stream.ReadInt32(); form.UpdateProgressBar(form.Controls["progBar"], "max", FilesCount); stream.Seek(-280, SeekOrigin.End); long FileTableOffset = stream.ReadInt64() ^ stream.key.KEY_1; stream.Seek(FileTableOffset, SeekOrigin.Begin); BinaryReader TableStream = new BinaryReader(new MemoryStream(stream.ReadBytes((int)(stream.GetLenght() - FileTableOffset - 288)))); for (int i = 0; i < FilesCount; ++i) { int EntrySize = TableStream.ReadInt32() ^ stream.key.KEY_1; TableStream.ReadInt32(); yield return(new PCKFileEntry(TableStream.ReadBytes(EntrySize), version)); } }
public byte[] ReadFile(PCKStream stream, PCKFileEntry file) { stream.Seek(file.Offset, SeekOrigin.Begin); byte[] bytes = stream.ReadBytes(file.CompressedSize); return(file.CompressedSize < file.Size ? PCKZlib.Decompress(bytes, file.Size) : bytes); }