Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# GZipStream C压缩/解压缩中的问题#_C#_.net_Visual Studio - Fatal编程技术网

C# GZipStream C压缩/解压缩中的问题#

C# GZipStream C压缩/解压缩中的问题#,c#,.net,visual-studio,C#,.net,Visual Studio,有人能帮助理解下面代码中的错误吗? 如图所示,我只是试图压缩和解压缩内存流 //read var memStream = new MemoryStream(); using (Stream fs = File.Open(@"..\..\..\TextFile.txt", FileMode.Open)) { var byteArray = new byte[1 * 1024];

有人能帮助理解下面代码中的错误吗? 如图所示,我只是试图压缩和解压缩内存流

        //read
            var memStream = new MemoryStream();            
            using (Stream fs = File.Open(@"..\..\..\TextFile.txt", FileMode.Open)) {
                var byteArray = new byte[1 * 1024];
                int len = 0;

                while ((len = fs.Read(byteArray, 0, byteArray.Length)) > 0) {
                    memStream.Write(byteArray, 0, len);
                }
            }
            Console.WriteLine("read bytes {0}",memStream.Length);

            //compress
            byte[] compBytes;
            using (var memStream2 = new MemoryStream()) {
                memStream2.Position = 0;
                using (var zipStream = new GZipStream(memStream2, CompressionMode.Compress)) {
                    memStream.Position = 0;
                     memStream.CopyTo(zipStream);                    
                    compBytes = memStream2.ToArray();
                }

            }
            Console.WriteLine("compressed bytes {0}", compBytes.Length);

            //decompress
            byte[] decompBytes;
            using (var memStream3 = new MemoryStream(compBytes)) {
                memStream3.Seek(0, SeekOrigin.Begin);
                using (var memStream4 = new MemoryStream()) {
                    using (var zipStream = new GZipStream(memStream3, CompressionMode.Decompress)) {

                        zipStream.CopyTo(memStream4);
                        decompBytes = memStream4.ToArray();
                    }

                }
            }
            Console.WriteLine("decompressed bytes {0}", decompBytes.Length);
输出:

读取字节6034

压缩字节10

解压缩的字节0

在读取目标
内存流
之前,必须读取
gzip流
或它

试试这个:

//compress
byte[] compBytes;
using (var memStream2 = new MemoryStream()) {
    memStream2.Position = 0;
    using (var zipStream = new GZipStream(memStream2, CompressionMode.Compress)) {
        memStream.Position = 0;
         memStream.CopyTo(zipStream);  

    }
    compBytes = memStream2.ToArray();  <--- move it out of the zipstream using to flush it.

}
Console.WriteLine("compressed bytes {0}", compBytes.Length);
//压缩
字节[]个字节;
使用(var memStream2=newmemoryStream()){
memStream2.位置=0;
使用(var zipStream=new GZipStream(memStream2,CompressionMode.Compress)){
memStream.Position=0;
memStream.CopyTo(zipStream);
}
compBytes=memStream2.ToArray();您必须在读取目标
内存流之前读取
gzip流
或它

试试这个:

//compress
byte[] compBytes;
using (var memStream2 = new MemoryStream()) {
    memStream2.Position = 0;
    using (var zipStream = new GZipStream(memStream2, CompressionMode.Compress)) {
        memStream.Position = 0;
         memStream.CopyTo(zipStream);  

    }
    compBytes = memStream2.ToArray();  <--- move it out of the zipstream using to flush it.

}
Console.WriteLine("compressed bytes {0}", compBytes.Length);
//压缩
字节[]个字节;
使用(var memStream2=newmemoryStream()){
memStream2.位置=0;
使用(var zipStream=new GZipStream(memStream2,CompressionMode.Compress)){
memStream.Position=0;
memStream.CopyTo(zipStream);
}

compBytes=memStream2.ToArray();您不能创建2个压缩和解压缩的函数:

public static byte[] Compress(byte[] data)
{
    MemoryStream output = new MemoryStream();
    using (DeflateStream dstream = new DeflateStream(output, CompressionLevel.Optimal))
    {
        dstream.Write(data, 0, data.Length);
    }
    return output.ToArray();
}

public static byte[] Decompress(byte[] data)
{
    MemoryStream input = new MemoryStream(data);
    MemoryStream output = new MemoryStream();
    using (DeflateStream dstream = new DeflateStream(input, CompressionMode.Decompress))
    {
        dstream.CopyTo(output);
    }
    return output.ToArray();
}
如果要压缩和解压缩文本文件,请使用以下命令:

string file = File.ReadAllText("TEXT FILE LOCATION HERE");
            byte[] compressed = Compress(Encoding.ASCII.GetBytes(file));
            byte[] decompressed = Decompress(compressed);

您不能创建两个压缩和解压缩的函数:

public static byte[] Compress(byte[] data)
{
    MemoryStream output = new MemoryStream();
    using (DeflateStream dstream = new DeflateStream(output, CompressionLevel.Optimal))
    {
        dstream.Write(data, 0, data.Length);
    }
    return output.ToArray();
}

public static byte[] Decompress(byte[] data)
{
    MemoryStream input = new MemoryStream(data);
    MemoryStream output = new MemoryStream();
    using (DeflateStream dstream = new DeflateStream(input, CompressionMode.Decompress))
    {
        dstream.CopyTo(output);
    }
    return output.ToArray();
}
如果要压缩和解压缩文本文件,请使用以下命令:

string file = File.ReadAllText("TEXT FILE LOCATION HERE");
            byte[] compressed = Compress(Encoding.ASCII.GetBytes(file));
            byte[] decompressed = Decompress(compressed);

关闭zip流后调用
decompressedStream.Seek()
也很重要。否则,生成的“解压缩”流的大小比预期的小

//decompression:

var compressedStream =  new MemoryStream( myByteArray );
var decompressedStream =  new MemoryStream();

var zipStream =  new GZipStream( compressedStream, 
                                 CompressionMode.Decompress, true);  //NOTICE 'true': will close manually, later.

zipStream.CopyTo( decompressedStream ); 
zipStream.Close();
decompressedStream.Seek(0, SeekOrigin.Begin);     //NOTICE THIS LINE, after  .Close()
正如其他人提到的,调用
.Close()
后,我们可以访问它的数组,等等:

var loadable = myBinaryFormatter.Deserialize(decompressedStream) as MyFancyObject;
decompressedStream.Close();

关闭zip流后调用
decompressedStream.Seek()
也很重要。否则,生成的“解压缩”流的大小比预期的小

//decompression:

var compressedStream =  new MemoryStream( myByteArray );
var decompressedStream =  new MemoryStream();

var zipStream =  new GZipStream( compressedStream, 
                                 CompressionMode.Decompress, true);  //NOTICE 'true': will close manually, later.

zipStream.CopyTo( decompressedStream ); 
zipStream.Close();
decompressedStream.Seek(0, SeekOrigin.Begin);     //NOTICE THIS LINE, after  .Close()
正如其他人提到的,调用
.Close()
后,我们可以访问它的数组,等等:

var loadable = myBinaryFormatter.Deserialize(decompressedStream) as MyFancyObject;
decompressedStream.Close();

您可以将代码简化一点:只需使用fs.CopyTo(memStream)即可,而无需分块读取文件;此外,在构建新的MemoryStream后,您无需查找到流的开头。您可以将代码简化一点:无需分块读取文件,只需使用fs.CopyTo(memStream);此外,在构建一个新的MemoryStream之后,您不需要寻找流的开头。