/// <summary>
        /// Starts packaging
        /// </summary>
        /// <exception cref="IOException"></exception>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="ArgumentException"></exception>
        /// <exception cref="PathTooLongException"></exception>
        /// <exception cref="DirectoryNotFoundException"></exception>
        /// <exception cref="UnauthorizedAccessException"></exception>
        /// <exception cref="NotSupportedException"></exception>
        /// <exception cref="System.Security.SecurityException"></exception>
        /// <exception cref="ArgumentOutOfRangeException"></exception>
        /// <exception cref="ObjectDisposedException"></exception>
        /// <exception cref="EndOfStreamException"></exception>
        public void Pack()
        {
            PackingEvent?.Invoke(this, _pea);
            PackingDoneEventArgs _pdea = new PackingDoneEventArgs()
            {
                IsSuccessful = false
            };
            string filepath = Path.Combine(Directory, Package.PackageName + ".cmpkg");

            try
            {
                if (!System.IO.Directory.Exists(Directory))
                {
                    System.IO.Directory.CreateDirectory(Directory);
                }
                // 0x02, 0x1d, 0x1e - Start of Contents
                // 0x1c, 0x1d - File Separator
                // 0x1f, 0x1f, 0xfd - Filename/Content Separator

                long _totalAllBytes = 0;
                foreach (var ent in Package.Files)
                {
                    _totalAllBytes += ent.Contents.LongLength;
                }
                _pea.TotalAllBytes = _totalAllBytes;
                PackingEvent?.Invoke(this, _pea);
                using (BinaryWriter writer = new BinaryWriter(File.Create(filepath)))
                {
                    writer.Write(new byte[] { 0x00, 0x01, 0xc7, 0x56, 0x43, 0x4d, 0x50, 0x4b, 0x47, 0x00 });
                    writer.Write(Package.PackageName);
                    //writer.Write(new byte[] { 0xcd, 0xb0 });
                    writer.Write(Package.PackageCreationTime.ToBinary());
                    writer.Write(Package.Files.Length);
                    //writer.Write(new byte[] { 0x02, 0x1d, 0x1e });
                    //for (int i = 0; i < Package.Files.Length; i++)
                    //{
                    //    _pea.CurrentFilename = Package.Files[i].Filename;
                    //    _pea.TotalFileByte = Package.Files[i].Contents.LongLength;
                    //    PackingEvent?.Invoke(this, _pea);
                    //    writer.Write(Package.Files[i].Filename + Package.Files[i].Extention);
                    //    writer.Write(new byte[] { 0x1f, 0x1f, 0xfd });
                    //    for (int curByte = 0; curByte < Package.Files[i].Contents.Length; curByte++)
                    //    {
                    //        _pea.CurrentFileByte = curByte;
                    //        PackingEvent?.Invoke(this, _pea);
                    //        writer.Write(Package.Files[i].Contents[curByte]);
                    //    }
                    //    if (i != Package.Files.Length)
                    //    {
                    //        writer.Write(new byte[] { 0x1c, 0x1d });
                    //    }
                    //}
                    //writer.Write(new byte[] { 0xed, 0x0f, 0x11, 0xe0 });

                    HuffmanAlgorithm shrinker = new HuffmanAlgorithm();
                    shrinker.PercentCompleted += Shrinker_PercentCompleted;

                    Dictionary <string, byte[]> _files = new Dictionary <string, byte[]>();

                    for (int l = 0; l < Package.Files.Length; l++)
                    {
                        Stream      _shrinked = shrinker.ShrinkWithProgress(new MemoryStream(Package.Files[l].Contents), new char[] { });
                        List <byte> _fl       = new List <byte>();
                        for (long i = 0; i < _shrinked.Length; i++)
                        {
                            _fl.Add((byte)_shrinked.ReadByte());
                        }
                        _files.Add(Package.Files[l].Filename, _fl.ToArray());
                        _shrinked.Close();
                    }

                    for (int i = 0; i < Package.Files.Length; i++)
                    {
                        writer.Write(Package.Files[i].Filename + Package.Files[i].Extention);
                        writer.Write(_files[Package.Files[i].Filename].Length);
                    }

                    writer.Write(new byte[] { 0x1f, 0x1f, 0xfd });

                    for (int j = 0; j < Package.Files.Length; j++)
                    {
                        _pea.CurrentFilename  = Package.Files[j].Filename;
                        _pea.TotalFileByte    = _files[Package.Files[j].Filename].Length;
                        _pea.CurrentFileIndex = j;
                        PackingEvent?.Invoke(this, _pea);
                        for (long curbyte = 0; curbyte < _files[Package.Files[j].Filename].Length; curbyte++)
                        {
                            _pea.CurrentFileByte = curbyte;
                            PackingEvent?.Invoke(this, _pea);
                            writer.Write(_files[Package.Files[j].Filename][curbyte]);
                        }
                    }
                }
                _pdea.IsSuccessful = true;
                PackingDoneEvent?.Invoke(this, _pdea);
            }
            catch (Exception e)
            {
                _pdea.InnerException = e;
                PackingDoneEvent?.Invoke(this, _pdea);
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Starts packaging
        /// </summary>
        /// <exception cref="IOException"></exception>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="ArgumentException"></exception>
        /// <exception cref="PathTooLongException"></exception>
        /// <exception cref="DirectoryNotFoundException"></exception>
        /// <exception cref="UnauthorizedAccessException"></exception>
        /// <exception cref="NotSupportedException"></exception>
        /// <exception cref="System.Security.SecurityException"></exception>
        /// <exception cref="ArgumentOutOfRangeException"></exception>
        /// <exception cref="ObjectDisposedException"></exception>
        /// <exception cref="EndOfStreamException"></exception>
        public void Pack(int chunkSize = 4096, string customExtention = "cmpkg")
        {
            PackingEventArgs _pea = new PackingEventArgs()
            {
                CurrentFileByte = 0, CurrentFilename = "", TotalAllBytes = 0, TotalFileByte = 0
            };

            PackingEvent?.Invoke(this, _pea);
            PackingDoneEventArgs _pdea = new PackingDoneEventArgs()
            {
                IsSuccessful = false
            };
            string filepath = Path.Combine(Directory, Package.PackageName + "." + customExtention);

            try
            {
                if (!System.IO.Directory.Exists(Directory))
                {
                    System.IO.Directory.CreateDirectory(Directory);
                }
                // 0x02, 0x1d, 0x1e - Start of Contents
                // 0x1c, 0x1d - File Separator
                // 0x1f, 0x1f, 0xfd - Filename/Content Separator

                long _totalAllBytes = 0;
                foreach (var ent in Package.Files)
                {
                    _totalAllBytes += ent.Contents.LongLength;
                }
                _pea.TotalAllBytes = _totalAllBytes;
                PackingEvent?.Invoke(this, _pea);
                using (BinaryWriter writer = new BinaryWriter(File.Create(filepath)))
                {
                    writer.Write(new byte[] { 0x00, 0x02, 0xc7, 0x56, 0x43, 0x4d, 0x50, 0x4b, 0x47, 0x00 });
                    writer.Write(Package.PackageName);
                    //writer.Write(new byte[] { 0xcd, 0xb0 });
                    writer.Write(Package.PackageCreationTime.ToBinary());
                    writer.Write(Package.Files.Length);

                    for (int i = 0; i < Package.Files.Length; i++)
                    {
                        writer.Write(Package.Files[i].Filename + Package.Files[i].Extention);
                        writer.Write(Package.Files[i].Contents.LongLength);
                    }

                    writer.Write(new byte[] { 0x1f, 0x1f, 0xfd });
                    long _totalBytesWithMeta = _totalAllBytes + writer.BaseStream.Position;
                    for (int j = 0; j < Package.Files.Length; j++)
                    {
                        int fileChunksCount = (int)Math.Ceiling((double)Package.Files[j].Contents.LongLength / (double)chunkSize);

                        _pea.CurrentFilename  = Package.Files[j].Filename;
                        _pea.TotalFileByte    = Package.Files[j].Contents.LongLength;
                        _pea.CurrentFileIndex = j;
                        writer.BaseStream.WriteAsync(Package.Files[j].Contents, 0, (int)Package.Files[j].Contents.LongLength);
                        _pea.PackingPercentage = (int)(((double)writer.BaseStream.Position / _totalBytesWithMeta) * 100.0d);
                        PackingEvent?.Invoke(this, _pea);
                    }
                }
                _pdea.IsSuccessful = true;
                PackingDoneEvent?.Invoke(this, _pdea);
            }
            catch (Exception e)
            {
                _pdea.InnerException = e;
                PackingDoneEvent?.Invoke(this, _pdea);
            }
        }
 private void Shrinker_PercentCompleted()
 {
     _pea.CurrentStatus      = PackingStatus.Shrinking;
     _pea.ShrinkingProgress += 1;
     PackingEvent?.Invoke(this, _pea);
 }
        /// <summary>
        /// Starts packaging
        /// </summary>
        /// <exception cref="IOException"></exception>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="ArgumentException"></exception>
        /// <exception cref="PathTooLongException"></exception>
        /// <exception cref="DirectoryNotFoundException"></exception>
        /// <exception cref="UnauthorizedAccessException"></exception>
        /// <exception cref="NotSupportedException"></exception>
        /// <exception cref="System.Security.SecurityException"></exception>
        /// <exception cref="ArgumentOutOfRangeException"></exception>
        /// <exception cref="ObjectDisposedException"></exception>
        /// <exception cref="EndOfStreamException"></exception>
        public void Pack()
        {
            PackingEventArgs _pea = new PackingEventArgs()
            {
                CurrentFileByte = 0, CurrentFilename = "", TotalAllBytes = 0, TotalFileByte = 0
            };

            PackingEvent?.Invoke(this, _pea);
            PackingDoneEventArgs _pdea = new PackingDoneEventArgs()
            {
                IsSuccessful = false
            };
            string filepath = Path.Combine(Directory, Package.PackageName + ".cmpkg");

            try
            {
                if (!System.IO.Directory.Exists(Directory))
                {
                    System.IO.Directory.CreateDirectory(Directory);
                }
                // 0x02, 0x1d, 0x1e - Start of Contents
                // 0x1c, 0x1d - File Separator
                // 0x1f, 0x1f, 0xfd - Filename/Content Separator

                long _totalAllBytes = 0;
                foreach (var ent in Package.Files)
                {
                    _totalAllBytes += ent.Contents.LongLength;
                }
                _pea.TotalAllBytes = _totalAllBytes;
                PackingEvent?.Invoke(this, _pea);
                using (BinaryWriter writer = new BinaryWriter(File.Create(filepath)))
                {
                    writer.Write(new byte[] { 0x00, 0x01, 0xc7, 0x56, 0x43, 0x4d, 0x50, 0x4b, 0x47, 0x00 });
                    writer.Write(Package.PackageName);
                    //writer.Write(new byte[] { 0xcd, 0xb0 });
                    writer.Write(Package.PackageCreationTime.ToBinary());
                    writer.Write(Package.Files.Length);
                    //writer.Write(new byte[] { 0x02, 0x1d, 0x1e });
                    //for (int i = 0; i < Package.Files.Length; i++)
                    //{
                    //    _pea.CurrentFilename = Package.Files[i].Filename;
                    //    _pea.TotalFileByte = Package.Files[i].Contents.LongLength;
                    //    PackingEvent?.Invoke(this, _pea);
                    //    writer.Write(Package.Files[i].Filename + Package.Files[i].Extention);
                    //    writer.Write(new byte[] { 0x1f, 0x1f, 0xfd });
                    //    for (int curByte = 0; curByte < Package.Files[i].Contents.Length; curByte++)
                    //    {
                    //        _pea.CurrentFileByte = curByte;
                    //        PackingEvent?.Invoke(this, _pea);
                    //        writer.Write(Package.Files[i].Contents[curByte]);
                    //    }
                    //    if (i != Package.Files.Length)
                    //    {
                    //        writer.Write(new byte[] { 0x1c, 0x1d });
                    //    }
                    //}
                    //writer.Write(new byte[] { 0xed, 0x0f, 0x11, 0xe0 });


                    for (int i = 0; i < Package.Files.Length; i++)
                    {
                        writer.Write(Package.Files[i].Filename + Package.Files[i].Extention);
                        writer.Write(Package.Files[i].Contents.LongLength);
                    }

                    writer.Write(new byte[] { 0x1f, 0x1f, 0xfd });

                    for (int j = 0; j < Package.Files.Length; j++)
                    {
                        _pea.CurrentFilename  = Package.Files[j].Filename;
                        _pea.TotalFileByte    = Package.Files[j].Contents.LongLength;
                        _pea.CurrentFileIndex = j;
                        PackingEvent?.Invoke(this, _pea);
                        for (long curbyte = 0; curbyte < Package.Files[j].Contents.LongLength; curbyte++)
                        {
                            _pea.CurrentFileByte = curbyte;
                            PackingEvent?.Invoke(this, _pea);
                            writer.Write(Package.Files[j].Contents[curbyte]);
                        }
                    }
                }
                _pdea.IsSuccessful = true;
                PackingDoneEvent?.Invoke(this, _pdea);
            }
            catch (Exception e)
            {
                _pdea.InnerException = e;
                PackingDoneEvent?.Invoke(this, _pdea);
            }
        }