【问题标题】:C# Cannot access a closed stream while copying GZipStream to MemoryStreamC# 将 GZipStream 复制到 MemoryStream 时无法访问关闭的流
【发布时间】:2020-08-17 11:08:44
【问题描述】:

我一直在尝试将 GZipStream 转换为 MemoryStream,然后将其转换为字节数组,而无需将任何文件写入硬盘。我一直在尝试将其复制到 MemoryStream 中,但出现此错误:未处理的异常:System.ObjectDisposedException:无法访问已关闭的流。

我查看了其他一些解决方案,但未能成功地将它们实施到我想要完成的任务中。

GZipStream decompressedStream = Decompress(new FileInfo(args[0]));
        using (var finalStream = new MemoryStream())
        {
            decompressedStream.CopyTo(finalStream);
            byte[] decompressedBytes = new byte[finalStream.Length];
        }

编辑:有人想让我添加 Decompress() 的代码,所以这里是

public static GZipStream Decompress(FileInfo fileToDecompress)
    {
        using (FileStream originalFileStream = fileToDecompress.OpenRead())
        {
            string currentFileName = fileToDecompress.FullName;
            string newFileName = currentFileName.Remove(currentFileName.Length - fileToDecompress.Extension.Length) + " (decompressed)";
            using (FileStream decompressedFileStream = File.Create(newFileName))
            {
                using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress))
                {
                    return decompressionStream;
                }
            }
        }
    }

【问题讨论】:

  • 你试过 decompressedStream.Close() 吗?也看看stackoverflow.com/questions/24253975/…
  • 你能解释一下Decompress。它是返回GZipStream 的函数吗?如果是,请添加它的代码。
  • @Hamid Reza Mohammadi 是的,我会在问题中添加解压缩功能

标签: c# memorystream gzipstream


【解决方案1】:

问题就在这里:

using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress))
{
     return decompressionStream;
}

using 语句(参见this 文章)处理流,您不能在块外使用它。将您的 MemoryStream 处理移动到此块内,并从方法中返回 byte[]

这样的事情应该可以工作:

public static byte[] Decompress(FileInfo fileToDecompress)
{
    using (FileStream originalFileStream = fileToDecompress.OpenRead())
    {
        string currentFileName = fileToDecompress.FullName;
        string newFileName = currentFileName.Remove(currentFileName.Length - fileToDecompress.Extension.Length) + " (decompressed)";
        using (FileStream decompressedFileStream = File.Create(newFileName))
        {
            using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress))
            using (var finalStream = new MemoryStream())
            {
                decompressionStream.CopyTo(finalStream);
                return finalStream.ToArray();
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 2011-12-27
    • 2012-06-11
    • 2018-10-14
    • 1970-01-01
    • 2021-01-08
    • 2012-03-19
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    相关资源
    最近更新 更多