C# Невозможно получить доступ к закрытому потоку при копировании GZipStream в MemoryStream - PullRequest
1 голос
/ 03 мая 2020

Я пытался преобразовать GZipStream в MemoryStream, а затем преобразовать его в байтовый массив без необходимости записывать какие-либо файлы на жесткий диск. Я пытался скопировать его в MemoryStream, но получаю эту ошибку: Необработанное исключение: System.ObjectDisposedException: Не удается получить доступ к закрытому потоку.

Я смотрел на некоторые другие решения, но я не смог успешно внедрить их в то, что я пытаюсь выполнить sh.

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;
                }
            }
        }
    }

1 Ответ

2 голосов
/ 03 мая 2020

Проблема здесь:

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

using оператор (см. эту статью) удаляет поток, и вы не можете использовать его вне блока. Переместите обработку 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();
            }
        }
    }
}
...