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