/// <summary> /// Disposes of resources allocated by the cabinet engine. /// </summary> /// <param name="disposing">If true, the method has been called directly /// or indirectly by a user's code, so managed and unmanaged resources /// will be disposed. If false, the method has been called by the runtime /// from inside the finalizer, and only unmanaged resources will be /// disposed.</param> protected override void Dispose(bool disposing) { if (disposing) { if (packer != null) { packer.Dispose(); packer = null; } if (unpacker != null) { unpacker.Dispose(); unpacker = null; } } base.Dispose(disposing); }
private void AddFile( string name, Stream stream, FileAttributes attributes, DateTime lastWriteTime, bool execute, CompressionLevel compLevel) { this.FileStream = stream; this.fileAttributes = attributes & (FileAttributes.Archive | FileAttributes.Hidden | FileAttributes.ReadOnly | FileAttributes.System); this.fileLastWriteTime = lastWriteTime; this.currentFileName = name; NativeMethods.FCI.TCOMP tcomp = CabPacker.GetCompressionType(compLevel); IntPtr namePtr = IntPtr.Zero; try { Encoding nameEncoding = Encoding.ASCII; if (Encoding.UTF8.GetByteCount(name) > name.Length) { nameEncoding = Encoding.UTF8; this.fileAttributes |= FileAttributes.Normal; // _A_NAME_IS_UTF } byte[] nameBytes = nameEncoding.GetBytes(name); namePtr = Marshal.AllocHGlobal(nameBytes.Length + 1); Marshal.Copy(nameBytes, 0, namePtr, nameBytes.Length); Marshal.WriteByte(namePtr, nameBytes.Length, 0); this.Erf.Clear(); var result = NativeMethods.FCI.AddFile( this.fciHandle, String.Empty, namePtr, execute, this.fciGetNextCabinet, this.fciCreateStatus, this.fciGetOpenInfo, tcomp); if (result == 0) { // Stop compiler from complaining this.CheckError(false); this.FileStream = null; this.currentFileName = null; return; } } finally { if (namePtr != IntPtr.Zero) { Marshal.FreeHGlobal(namePtr); } } this.CheckError(false); this.FileStream = null; this.currentFileName = null; }