2010-08-02 84 views

回答

6

看一看的GZipStream,它是在框架中内置的ZIP支持的一个,还有的MSDN页面上的例子: http://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream.aspx

下面是来自MSDN页面的例子:

public class Program 
{ 

    public static void Main() 
    { 
     // Path to directory of files to compress and decompress. 
     string dirpath = @"c:\users\public\reports"; 

     DirectoryInfo di = new DirectoryInfo(dirpath); 

     // Compress the directory's files. 
     foreach (FileInfo fi in di.GetFiles()) 
     { 
      Compress(fi); 
     } 

     // Decompress all *.gz files in the directory. 
     foreach (FileInfo fi in di.GetFiles("*.gz")) 
     { 
      Decompress(fi); 
     } 
    } 

    public static void Compress(FileInfo fi) 
    { 
     // Get the stream of the source file. 
     using (FileStream inFile = fi.OpenRead()) 
     { 
      // Prevent compressing hidden and 
      // already compressed files. 
      if ((File.GetAttributes(fi.FullName) 
       & FileAttributes.Hidden) 
       != FileAttributes.Hidden & fi.Extension != ".gz") 
      { 
       // Create the compressed file. 
       using (FileStream outFile = 
          File.Create(fi.FullName + ".gz")) 
       { 
        using (GZipStream Compress = 
         new GZipStream(outFile, 
         CompressionMode.Compress)) 
        { 
         // Copy the source file into 
         // the compression stream. 
        inFile.CopyTo(Compress); 

         Console.WriteLine("Compressed {0} from {1} to {2} bytes.", 
          fi.Name, fi.Length.ToString(), outFile.Length.ToString()); 
        } 
       } 
      } 
     } 
    } 

    public static void Decompress(FileInfo fi) 
    { 
     // Get the stream of the source file. 
     using (FileStream inFile = fi.OpenRead()) 
     { 
      // Get original file extension, for example 
      // "doc" from report.doc.gz. 
      string curFile = fi.FullName; 
      string origName = curFile.Remove(curFile.Length - 
        fi.Extension.Length); 

      //Create the decompressed file. 
      using (FileStream outFile = File.Create(origName)) 
      { 
       using (GZipStream Decompress = new GZipStream(inFile, 
         CompressionMode.Decompress)) 
       { 
        // Copy the decompression stream 
        // into the output file. 
        Decompress.CopyTo(outFile); 

        Console.WriteLine("Decompressed: {0}", fi.Name); 
       } 
      } 
     } 
    } 
} 
+2

这将不允许您解压缩和压缩ZIP文件。尽管它们都使用DEFLATE,但ZIP和GZIP不兼容。 – 2010-08-02 14:07:38

3

你有两个选择,

1)你可以使用一个第三方API,如DotNetZip(http://www.codeplex.com/DotNetZip

2),也可以使用System.IO.Compression.DeflateStream。它需要.NET 2.0。

+2

不,“DeflateStream”不能解压缩文件。 – Noldorin 2010-08-02 09:41:35

+0

我认为它 - 从MSDN“这个类代表Deflate算法,无损文件压缩和解压缩的行业标准算法” - http://msdn.microsoft.com/en-us/library/system.io.compression .deflatestream.aspx – Bhaskar 2010-08-02 12:03:48

+3

仅DeflateStream无法解压缩.zip文件。实际上,您明确链接的页面说:“这个类本身不提供向.zip文件添加文件或从.zip文件中提取文件的功能。” – 2010-08-02 14:09:38

-1

在.NET中,有两种内置的压缩​​流处理方式。 DeflateStream和GZipStream

DeflateStream ds = new DeflateStream(File.OpenRead(@"c:\myfolder\data.zip"), CompressionMode.Decompress); 

GZipStream gZip = new GZipStream(File.OpenRead(@"c:\myfolder\data.zip"), CompressionMode.Decompress); 
+0

文件不是流。他们得到了你指定的流不能使用的标题。 – AgentFire 2012-09-10 16:12:22