gpt4 book ai didi

c# - 读取压缩文件并写入新文件将不允许解压

转载 作者:行者123 更新时间:2023-11-30 17:17:14 26 4
gpt4 key购买 nike

我有一个测试程序可以展示我所希望的最终结果(尽管在这个测试程序中这些步骤似乎是不必要的)。

该程序使用 GZipStream 将数据压缩到文件中。生成的压缩文件是 C:\mydata.dat

然后我读取这个文件,并将它写入一个新文件。

//Read original file
string compressedFile = String.Empty;
using (StreamReader reader = new StreamReader(@"C:\mydata.dat"))
{
compressedFile = reader.ReadToEnd();
reader.Close();
reader.Dispose();
}

//Write to a new file
using (StreamWriter file = new StreamWriter(@"C:\mynewdata.dat"))
{
file.WriteLine(compressedUserFile);
}

当我尝试解压这两个文件时,原来的解压完美,但新文件抛出 InvalidDataException 消息 GZip header 中的魔数(Magic Number)不正确。确保您传入的是 GZip 流。

为什么这些文件不同?

最佳答案

StreamReader 用于读取一系列字符,而不是字节。这同样适用于 StremWriter。由于将压缩文件视为字符流没有任何意义,因此您应该使用 Stream 的某种实现。如果您想将流作为字节数组获取,可以使用 MemoryStream

使用字符流不起作用的确切原因是它们默认采用 UTF-8 编码。如果某个字节不是有效的 UTF-8(如 header 的第二个字节,0x8B),则表示为 Unicode“替换字符”(U+FFFD)。当字符串被写回时,该字符使用 UTF-8 编码为与源中完全不同的内容。

例如,要从流中读取文件,将其作为字节数组获取,然后将其作为流写入另一个文件:

byte[] bytes;
using (var fileStream = new FileStream(@"C:\mydata.dat", FileMode.Open))
using (var memoryStream = new MemoryStream())
{
fileStream.CopyTo(memoryStream);
bytes = memoryStream.ToArray();
}

using (var memoryStream = new MemoryStream(bytes))
using (var fileStream = new FileStream(@"C:\mynewdata.dat", FileMode.Create))
{
memoryStream.CopyTo(fileStream);
}

CopyTo() 方法仅在 .Net 4 中可用,但 you can write your own如果您使用旧版本。

当然,对于这个简单的例子,没有必要使用流。你可以简单地做:

byte[] bytes = File.ReadAllBytes(@"C:\mydata.dat");
File.WriteAllBytes(@"C:\mynewdata.dat", bytes);

关于c# - 读取压缩文件并写入新文件将不允许解压,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6681058/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com