Exemplo n.º 1
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");
        }
Exemplo n.º 2
0
        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));
            }
        }
Exemplo n.º 3
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);
 }