예제 #1
0
        static Func <bool> GzipFinished([NotNull] GZipStream ins)
        {
            try
            {
                var g = ins.GetType().GetField("deflateStream", BindingFlags.Instance | BindingFlags.NonPublic);
                if (g == null)
                {
                    return(null);
                }
                var s = (DeflateStream)g.GetValue(ins);
                if (s == null)
                {
                    return(null);
                }
                var f = s.GetType().GetField("inflater", BindingFlags.Instance | BindingFlags.NonPublic);
                if (f == null)
                {
                    return(null);
                }
                var fo    = f.GetValue(s);
                var avf   = fo?.GetType().GetProperty("AvailableOutput");
                var bterm = fo?.GetType().GetField("bfinal", BindingFlags.Instance | BindingFlags.NonPublic);
                if (avf == null || bterm == null)
                {
                    return(null);
                }

                return(() =>
                       (int?)avf.GetValue(fo, new object[0]) == 0 && // no more data in decode buffer
                       (int?)bterm.GetValue(fo) == 1); // have reached end of stream
            }
            catch (Exception)
            {
                return(null);
            }
        }
        public void Zlib_DisposedException_GZipStream()
        {
            string TextToCompress =  IhaveaDream;

            MemoryStream ms1= new MemoryStream();

            Stream compressor= new GZipStream(ms1, CompressionMode.Compress, false);

            TestContext.WriteLine("Text to compress is {0} bytes: '{1}'",
                                  TextToCompress.Length, TextToCompress);
            TestContext.WriteLine("using compressor: {0}", compressor.GetType().FullName);

            StreamWriter sw = new StreamWriter(compressor, Encoding.ASCII);
            sw.Write(TextToCompress);
            sw.Close(); // implicitly closes compressor
            sw.Close(); // implicitly closes compressor, again

            compressor.Close(); // explicitly closes compressor
            var a = ms1.ToArray();
            TestContext.WriteLine("Compressed stream is {0} bytes long", a.Length);

            var ms2 = new MemoryStream(a);
            Stream decompressor  = new GZipStream(ms2, CompressionMode.Decompress, false);

            TestContext.WriteLine("using decompressor: {0}", decompressor.GetType().FullName);

            var sr = new StreamReader(decompressor, Encoding.ASCII);
            string DecompressedText = sr.ReadToEnd();
            sr.Close();

            TestContext.WriteLine("decompressor.CanRead = {0}",decompressor.CanRead);

            TestContext.WriteLine("Read {0} characters: '{1}'", DecompressedText.Length, DecompressedText);
            TestContext.WriteLine("\n");
            Assert.AreEqual<String>(TextToCompress, DecompressedText);
        }