使用C#2.0进行文件压缩和解压


Posted on 
2005 - 09 - 17   10 : 55  银河 阅读( 2478 ) 评论( 7 )  编辑 收藏 引用 网摘 所属分类: .NET Framework
在FCL2.0中增加了System.IO.Compression命名空间, 用以进行文件压缩和解压操作,如下所示:
using  System;
using  System.IO;
using  System.IO.Compression;

namespace  Skyiv.Helper
{
    
static   class  Zip
    {
      
public   static   void  CompressFile( string  sourceFile,  string  destinationFile)
      {
        
if  ( ! File.Exists(sourceFile))  throw   new  FileNotFoundException();
      
using  (FileStream sourceStream  =   new  FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read))
      {
        
byte  [] buffer  =   new   byte [sourceStream.Length];
        
int  checkCounter  =  sourceStream.Read(buffer,  0 , buffer.Length);
        
if  (checkCounter  !=  buffer.Length)  throw   new  ApplicationException();
          
using  (FileStream destinationStream  =   new  FileStream(destinationFile, FileMode.OpenOrCreate, FileAccess.Write))
          {
            
using  (GZipStream compressedStream  =   new  GZipStream(destinationStream, CompressionMode.Compress,  true ))
            {
              compressedStream.Write(buffer, 
0 , buffer.Length);
            }
          }
        }
      }
    
    
public   static   void  DecompressFile( string  sourceFile,  string  destinationFile)
      {
        
if  ( ! File.Exists( sourceFile))  throw   new  FileNotFoundException();
      
using  (FileStream sourceStream  =   new  FileStream(sourceFile, FileMode.Open))
        {
        
byte  [] quartetBuffer  =   new   byte [ 4 ];
        
int  position  =  ( int )sourceStream.Length  -   4 ;
        sourceStream.Position 
=  position;
        sourceStream.Read(quartetBuffer, 
0 4 );
        sourceStream.Position 
=   0 ;
        
int  checkLength  =  BitConverter.ToInt32(quartetBuffer,  0 );
        
byte [] buffer  =   new   byte [checkLength  +   100 ];
          
using  (GZipStream decompressedStream  =   new  GZipStream(sourceStream, CompressionMode.Decompress,  true ))
          {
            
int  total  =   0 ;
          
for  ( int  offset  =   0 ; ; )
          {
            
int  bytesRead  =  decompressedStream.Read(buffer, offset,  100 );
            
if  (bytesRead  ==   0 break ;
            offset 
+=  bytesRead;
            total 
+=  bytesRead;
          }
              
using  (FileStream destinationStream  =   new  FileStream(destinationFile, FileMode.Create))
              {
                destinationStream.Write(buffer, 
0 , total);
                destinationStream.Flush();
              }
        }
      }
    }
    }
}
using  System;
using  System.IO;
using  Skyiv.Helper;

namespace  Skyiv.Test
{
    
sealed   class  TestMain
    {
        
static   void  Main()
        {
            
try
            {
                
string  [] nameList  =  { " zip.zip " " zip.cs " " zip.txt " };
                Zip.CompressFile(nameList[
1 ], nameList[ 0 ]);
                Zip.DecompressFile(nameList[
0 ], nameList[ 2 ]);
                
foreach  ( string  name  in  nameList)
                {
                    Console.WriteLine(
" {0,-11}: {1,11:N0} bytes " , name,  new  FileInfo(name).Length);
                }
            }
            
catch  (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}
运行结果如下:
zip.zip    :         
773  bytes
zip.cs     :       
2 , 196  bytes
zip.txt    :       
2 , 196  bytes
但是,如果有使用Zip.DecompressFile()方法去解压标准的ZIP文件,就会出现以下错误:
GZip 头中的幻数不正确。请确保正在传入 GZip 流。
此外,使用Zip.CompressFile()方法也不能将多个文件放入一个ZIP包。
看来,FCL2.0还是不能处理标准的ZIP文件,我目前是使用第三方的ICSharpZipLib来处理ZIP文件:
http:
// www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx
不知各位是使用什么方案来处理ZIP文件的 ?

你可能感兴趣的:(C#)