diff --git a/src/ICSharpCode.SharpZipLib/GZip/GzipOutputStream.cs b/src/ICSharpCode.SharpZipLib/GZip/GzipOutputStream.cs index 3079b04aa..6ea665a65 100644 --- a/src/ICSharpCode.SharpZipLib/GZip/GzipOutputStream.cs +++ b/src/ICSharpCode.SharpZipLib/GZip/GzipOutputStream.cs @@ -44,6 +44,12 @@ private enum OutputState Closed, }; + private enum FlagSetFileName + { + SET = GZipConstants.FNAME, + NotSet = 0x0 + } + #region Instance Fields /// @@ -52,6 +58,8 @@ private enum OutputState protected Crc32 crc = new Crc32(); private OutputState state_ = OutputState.Header; + private string filename_; + private FlagSetFileName flagFname_ = FlagSetFileName.NotSet; #endregion Instance Fields @@ -111,6 +119,24 @@ public int GetLevel() return deflater_.GetLevel(); } + /// + /// Set a file name internal gzip + /// + public string FileName + { + get + { + return filename_; + } + set + { + filename_ = value; + flagFname_ = !string.IsNullOrEmpty(filename_) + ? FlagSetFileName.SET + : FlagSetFileName.NotSet; + } + } + #endregion Public API #region Stream overrides @@ -218,8 +244,8 @@ private void WriteHeader() // The compression type (byte) Deflater.DEFLATED, - // The flags (not set) - 0, + // The flags (File Name) + (byte) flagFname_, // The modification time (byte) mod_time, (byte) (mod_time >> 8), @@ -232,6 +258,13 @@ private void WriteHeader() (byte) 255 }; baseOutputStream_.Write(gzipHeader, 0, gzipHeader.Length); + + if(flagFname_ == FlagSetFileName.SET) + { + var fileNameBytes = System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(FileName); + baseOutputStream_.Write(fileNameBytes, 0, fileNameBytes.Length); + baseOutputStream_.Write(new byte[] { 0 }, 0, 0); + } } }