C# 为什么我的GZipStream不可写?

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

我的程序中有一些GZ压缩的资源,我需要能够将它们写入临时文件以供使用。我编写了以下函数来写出文件,并在成功时返回
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我不明白为什么一个会起作用,另一个不会——从逻辑上讲,它们应该有相同的结果。谢谢你,汉斯!