C#實現Zip壓縮目錄中的所有文件

jopen 12年前發布 | 1K 次閱讀

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();
            }
        }
    }
}
}
}

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!