0

WP8 でファイルからコンテンツを読み取ってデータを圧縮および解凍しようとしています。圧縮または解凍できません。結果の文字列を圧縮すると、常に空になります。解凍中に「タイプ 'System.IO.InvalidDataException' の例外が SYSTEM.IO.COMPRESSION.NI.DLL で発生しましたが、ユーザー コードで処理されませんでした。

追加情報: ブロックの長さが補数と一致しません。」

コードは以下です

   public static async void CompressDecompress()
    {
        //Location of File to be Compressed
        string toCompressFileName = "ms-appx:///Assets/data.txt";  

        StorageFile toCompressFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri(toCompressFileName));
        Stream toCompressStream = await toCompressFile.OpenStreamForReadAsync();
        toCompressStream.Position = 0;

        string compressedString = Compress(toCompressStream);

        //Location of File to be Decompressed
        string toDecompressFileName = "ms-appx:///Assets/zipped_data.txt";
        StorageFile toDecompressFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri(toDecompressFileName));
        Stream toDecompressStream = await toDecompressFile.OpenStreamForReadAsync();
        toDecompressStream.Position = 0;

        string decompressedString = DeCompress(toDecompressStream);

    }

    public static string Compress(Stream toCompressStream)
    {
        using (MemoryStream resultCompressedStream = new MemoryStream())
        {
            using (DeflateStream compressionStream = new DeflateStream(resultCompressedStream, CompressionMode.Compress))
            {
                toCompressStream.CopyTo(compressionStream);
                toCompressStream.Flush();

                return Encoding.UTF8.GetString(resultCompressedStream.ToArray(), 0, Convert.ToInt32(resultCompressedStream.Length));
            }
        }
    }

    public static string DeCompress(Stream toDecompressStream)
    {
        using (MemoryStream resultDeCompressedStream = new MemoryStream())
        {
            using (DeflateStream decompressionStream = new DeflateStream(toDecompressStream, CompressionMode.Decompress))
            {
                decompressionStream.CopyTo(resultDeCompressedStream);
                decompressionStream.Flush();

                return Encoding.UTF8.GetString(resultDeCompressedStream.ToArray(), 0, Convert.ToInt32(resultDeCompressedStream.Length));
            }
        }           
    }

何が問題なのかを理解するのを手伝ってください。

4

1 に答える 1

0

適切なMinimal, Complete, and Verifiable exampleを含む質問なしに、すべてが間違っている可能性があることを確実に言うのは難しい. しかし、確かに、圧縮されたストリームに書き込むのではなく、圧縮されたストリームから読み取る必要があります。たとえば、次のようなものです。

   using (MemoryStream resultDeCompressedStream = new MemoryStream())
   {
       using (DeflateStream decompressionStream = new DeflateStream(decompressfileStream, CompressionMode.Decompress))
       {
           decompressionStream.CopyTo(resultDeCompressedStream);

           string decompressedString = Encoding.UTF8.GetString(resultDeCompressedStream.ToArray(), 0, Convert.ToInt32(resultDeCompressedStream.Length));
       }
   }

注:あなたのコードはdatafileStreamオブジェクトも使用していました。これはもちろん元の圧縮されていないデータ ファイルであり、既に最後まで読み取られていました。したがって、 を誤用していることを無視してもDeflateStream、それは機能しませんでした。上記の例でも、その問題に対処しました。つまり、明らかに意図した出力ストリームに書き込み、decompressfileStreamオブジェクトを の入力として使用しますDeflateStream

注:あなたの質問からは、圧縮側にも問題があるかどうかは明らかではありません。DeflateStreamしかし、そうであれば、データをコピーした後にオブジェクトを明示的にフラッシュ/クローズすることを検討することをお勧めします。

于 2016-01-30T07:32:55.067 に答える