0

ここで StackOverflow でいくつかの例を使用すると、次のコードは gzip ファイルを解凍し、メモリ ストリームを読み取り、その内容をコンソールに書き込むと考えました。エラーは発生しませんが、出力が得られません。

public static void Decompress(FileInfo fileToDecompress)
        {
            using (FileStream originalFileStream = fileToDecompress.OpenRead())
            {
                string currentFileName = fileToDecompress.FullName;
                string newFileName = currentFileName.Remove(currentFileName.Length - fileToDecompress.Extension.Length);

                using (FileStream decompressedFileStream = File.Create(newFileName))
                {
                    using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress))
                    {
                        MemoryStream memStream = new MemoryStream();
                        memStream.SetLength(decompressedFileStream.Length);
                        decompressedFileStream.Read(memStream.GetBuffer(), 0, (int)decompressedFileStream.Length);

                        memStream.Position = 0;
                        var sr = new StreamReader(memStream);
                        var myStr = sr.ReadToEnd();
                        Console.WriteLine("Stream Output: " + myStr);
                    }
                }
            }
        }
4

1 に答える 1

2

空のストリームをコピーしようとしています。「decompressedFileStream」は File.Create() によって作成されるため、空です。「decompressedFileStream」を「decompressionStream」に交換すると、ファイルの内容を「myStr」に表示できるようになります。

        public static void Decompress(FileInfo fileToDecompress)
    {
        using (FileStream originalFileStream = fileToDecompress.OpenRead())
        {
            string currentFileName = fileToDecompress.FullName;
            string newFileName = currentFileName.Remove(currentFileName.Length - fileToDecompress.Extension.Length);

            using (FileStream decompressedFileStream = File.Create(newFileName))
            {
                using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress))
                {
                    MemoryStream memStream = new MemoryStream();
                    //memStream.SetLength(decompressedFileStream.Length); not necessary
                    decompressionStream.CopyTo(memStream);

                    memStream.Seek(0, SeekOrigin.Begin);
                    var sr = new StreamReader(memStream);
                    var myStr = sr.ReadToEnd();
                    Console.WriteLine("Stream Output: " + myStr);
                }
            }
        }
    }

このスニペットを試してください。Read の代わりに CopyTo を使用してデータをメモリ ストリームにコピーし、Position の代わりに Seek() メソッドを使用してメモリ ストリームの開始時に戻ります。

于 2012-12-18T17:36:38.947 に答える