private void AddFile(string name, Stream stream, FileAttributes attributes, DateTime lastWriteTime, bool execute, CompressionLevel compLevel) { base.FileStream = stream; fileAttributes = attributes & (FileAttributes.ReadOnly | FileAttributes.Hidden | FileAttributes.System | FileAttributes.Archive); fileLastWriteTime = lastWriteTime; currentFileName = name; NativeMethods.FCI.TCOMP compressionType = GetCompressionType(compLevel); IntPtr intPtr = IntPtr.Zero; try { Encoding encoding = Encoding.ASCII; if (Encoding.UTF8.GetByteCount(name) > name.Length) { encoding = Encoding.UTF8; fileAttributes |= FileAttributes.Normal; } byte[] bytes = encoding.GetBytes(name); intPtr = Marshal.AllocHGlobal(checked (bytes.Length + 1)); Marshal.Copy(bytes, 0, intPtr, bytes.Length); Marshal.WriteByte(intPtr, bytes.Length, 0); base.Erf.Clear(); NativeMethods.FCI.AddFile(fciHandle, string.Empty, intPtr, execute, fciGetNextCabinet, fciCreateStatus, fciGetOpenInfo, compressionType); } finally { if (intPtr != IntPtr.Zero) { Marshal.FreeHGlobal(intPtr); } } CheckError(extracting: false); base.FileStream = null; currentFileName = null; }
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(); NativeMethods.FCI.AddFile( this.fciHandle, String.Empty, namePtr, execute, this.fciGetNextCabinet, this.fciCreateStatus, this.fciGetOpenInfo, tcomp); } finally { if (namePtr != IntPtr.Zero) { Marshal.FreeHGlobal(namePtr); } } this.CheckError(false); this.FileStream = null; this.currentFileName = null; }