C# GZip页脚中的流大小与实际流大小不匹配

C# GZip页脚中的流大小与实际流大小不匹配,c#,gzip,gzipstream,C#,Gzip,Gzipstream,当从GzipStream解压时,我得到一个IO异常“GZip页脚中的流大小与实际流大小不匹配”。这个错误100%都发生在多个文件上,所以我不认为这是一个“真正的”文件损坏问题 压缩代码如下所示: using (var fileStream = fileInfo.OpenRead()) { using (var outFile = File.Create(Path.Combine(backupLocation, backupFileName

当从GzipStream解压时,我得到一个IO异常“GZip页脚中的流大小与实际流大小不匹配”。这个错误100%都发生在多个文件上,所以我不认为这是一个“真正的”文件损坏问题

压缩代码如下所示:

 using (var fileStream = fileInfo.OpenRead())
            {
                using (var outFile = File.Create(Path.Combine(backupLocation, backupFileName.ToString())))
                {
                    using (var gzCompressionStream = new GZipStream(outFile, CompressionMode.Compress))
                    {
                        fileStream.CopyTo(gzCompressionStream);
                    }
                }
            }
using (var fileStream = fileInfo.OpenRead())
            {
                // remove the extension
                var fileName = fileInfo.Name;
                var originalName = fileName.Remove(fileName.Length - fileInfo.Extension.Length);

                using (var outFile = File.Create(Path.Combine(transferLocation, originalName)))
                {
                    using (var gzDecompressionStream = new GZipStream(fileStream,CompressionMode.Decompress))
                    {
                        gzDecompressionStream.CopyTo(outFile);
                    }
                }
            }
引发异常的解压缩代码如下所示:

 using (var fileStream = fileInfo.OpenRead())
            {
                using (var outFile = File.Create(Path.Combine(backupLocation, backupFileName.ToString())))
                {
                    using (var gzCompressionStream = new GZipStream(outFile, CompressionMode.Compress))
                    {
                        fileStream.CopyTo(gzCompressionStream);
                    }
                }
            }
using (var fileStream = fileInfo.OpenRead())
            {
                // remove the extension
                var fileName = fileInfo.Name;
                var originalName = fileName.Remove(fileName.Length - fileInfo.Extension.Length);

                using (var outFile = File.Create(Path.Combine(transferLocation, originalName)))
                {
                    using (var gzDecompressionStream = new GZipStream(fileStream,CompressionMode.Decompress))
                    {
                        gzDecompressionStream.CopyTo(outFile);
                    }
                }
            }

好的,谢谢你的帮助-看来我找到问题了。只有当压缩文件大小大于4GB时,我才发现一个错误,低于4GB,一切正常,-这应该不是问题,因为GZipStream在.Net 4(我正在使用)中适用于最大为8GB的文件大小,并且最大文件大小始终低于6GB(应用程序限制)。但是,以前版本的仅支持高达4GB的容量-在这种情况下,MSDN文档似乎不正确。

代码看起来合理。您是否验证了文件名是预期的(即检查一个硬编码名称为compress->decompress的文件)?抱歉,我不太清楚,文件名对解压缩有何影响?例如压缩:“Source.txt”->“compressed.compr”,解压缩:“random.file”(而不是“compressed.compr”)->“Source.txt”(作为“random.file”失败)您能发布一个简短但完整的示例来说明您的问题吗?这是GZipStream中的另一个错误。gzip流的最后四个字节是未压缩(未压缩)长度模2^32,用于检查数据。如果未压缩内容的低32位长度匹配,那么检查是好的。其中包括,它没有正确使用固定块、动态块和存储块,导致压缩输出对于短输入来说太大,并且crc失配通常没有检测到,在出现严重错误时不会导致错误。我建议永远不要使用Microsoft提供的此类。