Exemplo n.º 1
0
        public void ReadV2(byte[] bytes)
        {
            if (bytes.Length < 276)
            {
                bytes = PCKZlib.Decompress(bytes, 276);
            }
            BinaryReader br = new BinaryReader(new MemoryStream(bytes));

            Path           = Encoding.GetEncoding(936).GetString(br.ReadBytes(260)).Split(new string[] { "\0" }, StringSplitOptions.RemoveEmptyEntries)[0].Replace("/", "\\");
            Offset         = br.ReadUInt32();
            Size           = br.ReadInt32();
            CompressedSize = br.ReadInt32();
            br.Close();
        }
Exemplo n.º 2
0
 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);
 }
Exemplo n.º 3
0
        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");
        }