2013-06-04 18 views
0

我试图用这个代码来压缩部分GZipStream腐化文件,如果我在收拾部分它(同花顺不工作)

using (var fsIn = new FileStream("test.avi", FileMode.Open)) 
{ 
    using (var fsOut = new FileStream("test.avi.gz", FileMode.Create)) 
    { 
     var buf = new byte[1024 * 1024]; 

     using (var gzip = new GZipStream(fsOut, CompressionMode.Compress, true)) 
     { 
      while (true) 
      { 
       var readCount = fsIn.Read(buf, 0, buf.Length); 
       if (readCount <= 0) 
       { 
        break; 
       } 

       gzip.Write(buf, 0, buf.Length); 
       gzip.Flush(); 
      } 
     } 
    } 
} 

一个文件,但我已经有了解压后损坏的文件。此代码有效

using (var fsIn = new FileStream("test.avi", FileMode.Open)) 
{ 
    using (var fsOut = new FileStream("test.avi.gz", FileMode.Create)) 
    { 
     var buf = new byte[1024*1024]; 

     while (true) 
     { 
      var readCount = fsIn.Read(buf, 0, buf.Length); 
      if (readCount <= 0) 
      { 
       break; 
      } 

      // This string was transferred into "while" cycle 
      using (var gzip = new GZipStream(fsOut, CompressionMode.Compress, true)) 
      { 
       gzip.Write(buf, 0, buf.Length); 
      } 
     } 
    } 
} 

为什么gzip.Flush()不起作用?为什么只有gzip.Close()有效?

回答

0

宥需要知道gzip.Flush();不工作

MSDN - GZipStream.Flush

目前此方法的实现不刷新内部 缓冲区。处理对象时,内部缓冲区被刷新。

+0

嗯。内置的方法总结告诉了相反的情况。 –

1

new GZipStream(fsOut, CompressionMode.Compress, true)处理后留下流,应该将最后一个参数更改为false

GZipStream Constructor (Stream, CompressionMode, Boolean)

leaveOpen
类型:System.Boolean
true离开流配置的GZipStream对象后打开;否则,false

另外Flush()具有GZipStream

当前的实现该方法不刷新内部 缓冲器的没有影响。处理对象时,内部缓冲区被刷新。

+0

如果我会写“假”,那么它将无法正常工作,因为我需要离开fsOut在第二个版本中打开。并且默认值是false。 –

0

文件被正确压缩。事实证明,该文件包含一组压缩文件。档案号码等于数字部分。在每次新的迭代中,都会有一个新文件并附加到文件中。 决定

您需要指定包装后以及刻录到文件之前的包装长度。

就像这样:

压缩:

BitConverter.GetBytes(compressedPart.Length).CopyTo(blockToWrite, 4); 

在减压阅读长度,然后选择文件的一部分,等于这个长度为减压。

相关问题