为何使用GZipStream解压文本文件后丢失空格?
GZipStream解压后丢失空格的问题排查与解决
嘿,我仔细看了你的代码和问题描述,发现解压后空格丢失的问题大概率是压缩阶段源文件的打开方式不对导致的,咱们一步步来解决:
你压缩代码里用了FileMode.OpenOrCreate打开源文件:
using (FileStream sourceStream = new FileStream(sourceFile, FileMode.OpenOrCreate))
虽然这个模式能读取现有文件,但它的核心用途是允许创建或修改文件,不是单纯的读取操作。如果源文件之前被其他程序占用,或者你在写入源文件后没正确关闭,用这个模式打开的流可能会出现读取不完整的情况——刚好你的空格字节就这么丢了。
修正后的压缩代码
把源文件的打开模式改成FileMode.Open(专门用于读取现有文件),同时加上FileAccess.Read明确只读权限,这样更安全:
using (FileStream sourceStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read)) { using (FileStream targetStream = File.Create(compressedFile)) { using (GZipStream compressionStream = new GZipStream(targetStream, CompressionMode.Compress)) { sourceStream.CopyTo(compressionStream); } } }
解压代码优化建议(可保留但更严谨)
同样给压缩文件的读取加上只读权限,避免意外修改:
using (FileStream sourceStream = new FileStream(compressedFile, FileMode.Open, FileAccess.Read)) { using (FileStream targetStream = File.Create(targetFile)) { using (GZipStream decompressionStream = new GZipStream(sourceStream, CompressionMode.Decompress)) { decompressionStream.CopyTo(targetStream); } } }
- 另外,一定要确保压缩前源文件已经完全写入并关闭:如果你是先通过代码生成的源文件,要确保写入流已经调用了
Flush()或者被正确Dispose,不然源文件里的内容可能还在缓冲区没写到磁盘上,压缩的时候自然读不到完整内容。 - 你可以对比下源文件和解压后文件的字节数:如果字节数不一致,说明压缩过程中确实没读全源文件的内容,这时候优先检查源文件的打开和读取逻辑。
内容的提问来源于stack exchange,提问作者ensiferum
相关产品推荐
相关产品推荐

