C#实现Zip压缩目录中的所有文件

13年前
C#实现Zip压缩目录中的所有文件
using System;  using System.IO;  using System.Collections;  using System.IO.Compression;  using System.Collections.Generic;  class FolderZip  {  private const long BUFFER_SIZE = 20480;  static void main(string[] args)  {  string sourcepath=@"C:\tmp";  Queue<FileSystemInfo> Folders = new Queue<FileSystemInfo>(new DirectoryInfo(sourcepath).GetFileSystemInfos());  string copytopath = @"D:\temp";  copytopath = (copytopath.LastIndexOf(Path.DirectorySeparatorChar) == copytopath.Length - 1) ? copytopath : copytopath+Path.DirectorySeparatorChar + Path.GetFileName(sourcepath);  Directory.CreateDirectory(copytopath);  while (Folders.Count > 0)  {      FileSystemInfo atom = Folders.Dequeue();      FileInfo sourcefile = atom as FileInfo;      if (sourcefile == null)      {          DirectoryInfo directory = atom as DirectoryInfo;  Directory.CreateDirectory(directory.FullName.Replace(sourcepath,copytopath));          foreach (FileSystemInfo nextatom in directory.GetFileSystemInfos())              Folders.Enqueue(nextatom);      }      else      {          string sourcefilename = sourcefile.FullName;          string zipfilename = sourcefile.FullName.Replace(sourcepath,copytopath) + ".zip";          if (!File.Exists(zipfilename))          {              FileStream sourceStream = null;              FileStream destinationStream = null;              GZipStream compressedStream = null;              try              {                  // Read the bytes from the source file into a byte array                  sourceStream = new FileStream(sourcefilename, FileMode.Open, FileAccess.Read, FileShare.Read);                  // Open the FileStream to write to                  destinationStream = new FileStream(zipfilename, FileMode.OpenOrCreate, FileAccess.Write);                  // Create a compression stream pointing to the destiantion stream                  compressedStream = new DeflateStream(destinationStream, CompressionMode.Compress, true);                  long bufferSize = sourceStream.Length < BUFFER_SIZE ? sourceStream.Length : BUFFER_SIZE;                  byte[] buffer = new byte[bufferSize];                  int bytesRead = 0;                  long bytesWritten = 0;                  while ((bytesRead = sourceStream.Read(buffer, 0, buffer.Length)) != 0)                  {                      compressedStream.Write(buffer, 0, bytesRead);                      bytesWritten += bufferSize;                  }              }              catch (ApplicationException)              {                  continue;              }              finally              {                  // Make sure we allways close all streams                  if (sourceStream != null)  sourceStream.Close();                  if (compressedStream != null)  compressedStream.Close();                  if (destinationStream != null)  destinationStream.Close();              }          }      }  }  }  }