C# 为什么我的GZipStream不可写?
我的程序中有一些GZ压缩的资源,我需要能够将它们写入临时文件以供使用。我编写了以下函数来写出文件,并在成功时返回C# 为什么我的GZipStream不可写?,c#,compression,gzip,gzipstream,C#,Compression,Gzip,Gzipstream,我的程序中有一些GZ压缩的资源,我需要能够将它们写入临时文件以供使用。我编写了以下函数来写出文件,并在成功时返回true,或在失败时返回false。此外,我在其中添加了一个try/catch,在出现错误时显示一个MessageBox: private static bool extractCompressedResource(byte[] resource, string path) { try { using (MemoryStream ms = new MemoryStrea
true
,或在失败时返回false
。此外,我在其中添加了一个try/catch,在出现错误时显示一个MessageBox
:
private static bool extractCompressedResource(byte[] resource, string path)
{
try
{
using (MemoryStream ms = new MemoryStream(resource))
{
using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite))
{
using (GZipStream zs = new GZipStream(fs, CompressionMode.Decompress))
{
ms.CopyTo(zs); // Throws exception
zs.Close();
ms.Close();
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message); // Stream is not writeable
return false;
}
return true;
}
我在抛出异常的行上添加了一条注释。如果我在该行上放置一个断点并查看GZipStream
内部,那么我可以看到它是不可写的(这就是导致问题的原因)
是我做错了什么,还是这是GZipStream类的一个限制?你用错误的方式给管道安装管道。修正:
using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite))
using (MemoryStream ms = new MemoryStream(resource))
using (GZipStream zs = new GZipStream(ms, CompressionMode.Decompress))
{
zs.CopyTo(fs);
}
你用错误的方法给管道配管。修正:
using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite))
using (MemoryStream ms = new MemoryStream(resource))
using (GZipStream zs = new GZipStream(ms, CompressionMode.Decompress))
{
zs.CopyTo(fs);
}
不需要在“使用”块中关闭流,它们在被处理时将自动关闭。另外,正如所写的,当GZipStream被处理时,GZipStream将处理文件流。同样对于OP:根据经验,我们已经看到了在处理前不显式调用示例中的'zs'和'fs'时出现的问题。不需要在“使用”块中关闭流,它们在处理时会自动关闭。另外,如前所述,GZipStream在处理GZipStream时会处理文件流。同样对于OP:根据经验,我们已经看到了当您在处理之前没有显式调用示例中的'zs'和'fs'时出现的问题。您的解决方案是有效的。我可以看到发生了什么:在读取MemoryStream时进行解压缩,然后将解压缩后的数据直接写入文件。我试图从MemoryStream读取压缩数据,并在写入文件时解压缩。TBH我不明白为什么一个会起作用,另一个不会——从逻辑上讲,它们应该有相同的结果。谢谢你,汉斯!你的解决方案有效。我可以看到发生了什么:在读取MemoryStream时进行解压缩,然后将解压缩后的数据直接写入文件。我试图从MemoryStream读取压缩数据,并在写入文件时解压缩。TBH我不明白为什么一个会起作用,另一个不会——从逻辑上讲,它们应该有相同的结果。谢谢你,汉斯!