/// <summary>Saves container to new file.</summary> /// <param name="fileName">Name of the file.</param> public void SaveAs(string fileName) { using (var stream = new FileStream(fileName, FileMode.Create)) using (var writer = new BinaryWriter(stream)) { WriteHeadTo(writer); var newEntries = new List <LibZEntry>(); foreach (var oldEntry in _entries.Values.OrderBy(e => e.Offset)) { byte[] buffer; lock (_stream) { _stream.Position = oldEntry.Offset; buffer = _reader.ReadBytes(oldEntry.StorageLength); } var newEntry = new LibZEntry(oldEntry) { Offset = stream.Position }; writer.Write(buffer); newEntries.Add(newEntry); } WriteTailTo(writer, _containerId, newEntries); } }
/// <summary>Writes the entry to.</summary> /// <param name="writer">The writer.</param> /// <param name="entry">The entry.</param> private static void WriteEntryTo(BinaryWriter writer, LibZEntry entry) { writer.Write(entry.Id.ToByteArray()); writer.Write(entry.AssemblyName.FullName); writer.Write(entry.Hash.ToByteArray()); writer.Write((int)entry.Flags); writer.Write(entry.Offset); writer.Write(entry.OriginalLength); writer.Write(entry.StorageLength); writer.Write(entry.CodecName ?? string.Empty); }
/// <summary>Saves entry to file.</summary> /// <param name="resourceName">Name of the resource.</param> /// <param name="assemblyName">Name of the assembly.</param> /// <param name="input">The content of the assembly.</param> /// <param name="flags">The flags.</param> /// <param name="options">The options.</param> private void SetBytes( string resourceName, AssemblyName assemblyName, byte[] input, LibZEntry.EntryFlags flags, AppendOptions options) { var codecName = options.CodecName; lock (_stream) { // prepare entry var entry = new LibZEntry { Id = Hash.Get(resourceName), Hash = Hash.Get(input), AssemblyName = assemblyName, Offset = _magicOffset, Flags = flags, OriginalLength = input.Length, }; // add it to dictionary if (options.Overwrite) { _entries[entry.Id] = entry; } else { _entries.Add(entry.Id, entry); } // encode it var encoded = Encode(codecName, input); if (encoded != null) { entry.CodecName = codecName; input = encoded; } // write it _magicOffset += entry.StorageLength = WriteBytes(_stream, _magicOffset, input); _stream.SetLength(_stream.Position); _containerId = Guid.NewGuid(); _dirty = true; } }
/// <summary>Saves container to new file.</summary> /// <param name="fileName">Name of the file.</param> public void SaveAs(string fileName) { using (var stream = new FileStream(fileName, FileMode.Create)) using (var writer = new BinaryWriter(stream)) { WriteHeadTo(writer); var newEntries = new List<LibZEntry>(); foreach (var oldEntry in _entries.Values.OrderBy(e => e.Offset)) { byte[] buffer; lock (_stream) { _stream.Position = oldEntry.Offset; buffer = _reader.ReadBytes(oldEntry.StorageLength); } var newEntry = new LibZEntry(oldEntry) { Offset = stream.Position }; writer.Write(buffer); newEntries.Add(newEntry); } WriteTailTo(writer, _containerId, newEntries); } }
/// <summary>Gets the flags text.</summary> /// <param name="entryFlags">The entry flags.</param> /// <returns>Text representing assembly flags.</returns> private static IEnumerable<string> GetFlagsText(LibZEntry.EntryFlags entryFlags) { if ((entryFlags & LibZEntry.EntryFlags.Unmanaged) != 0) yield return "Unmanaged"; if ((entryFlags & LibZEntry.EntryFlags.AnyCPU) != 0) yield return "AnyCPU"; else if ((entryFlags & LibZEntry.EntryFlags.X64) != 0) yield return "x64"; else yield return "x86"; if ((entryFlags & LibZEntry.EntryFlags.Portable) != 0) yield return "Portable"; if ((entryFlags & LibZEntry.EntryFlags.SafeLoad) != 0) yield return "SafeLoad"; }