C#NET壓縮文件夾(包含空文件夾)到壓縮包方法

C#NET壓縮文件夾(包含空文件夾)到壓縮包方法

前提:ICSharpCode.SharpZipLib.dll引用

/// <summary>
/// 所有文件緩存
/// </summary>
List<string> files = new List<string>();

/// <summary>
/// 所有空目錄緩存
/// </summary>
List<string> paths = new List<string>();

/// <summary>
/// 取得目錄下所有文件及文件夾,分別存入files及paths
/// </summary>
/// <param name="rootPath">根目錄</param>
private void GetAllDirectories(string rootPath)
{
    string[] subPaths = Directory.GetDirectories(rootPath);//得到所有子目錄
    foreach (string path in subPaths)
    {
        GetAllDirectories(path);//對每一個字目錄做與根目錄相同的操作:即找到子目錄并將當前目錄的文件名存入List
    }
    string[] dirFiles = Directory.GetFiles(rootPath);
    foreach (string file in dirFiles)
    {
        this.files.Add(file);//將當前目錄中的所有文件全名存入文件List
    }
    if (subPaths.Length == dirFiles.Length && dirFiles.Length == 0)//如果是空目錄
    {
        this.paths.Add(rootPath);//記錄空目錄
    }
}


/// <summary>
/// 壓縮目錄(包括子目錄及所有文件)
/// </summary>
/// <param name="rootPath">要壓縮的根目錄</param>
/// <param name="destinationPath">保存路徑</param>
/// <param name="compressLevel">壓縮程度,范圍0-9,數值越大,壓縮程序越高</param>
public void ZipFileFromDirectory(string rootPath, string destinationPath, int compressLevel)
{
    GetAllDirectories(rootPath);

    string rootMark = rootPath + "\\";//得到當前路徑的位置,以備壓縮時將所壓縮內容轉變成相對路徑。
    Crc32 crc = new Crc32();
    ZipOutputStream outPutStream = new ZipOutputStream(System.IO.File.Create(destinationPath));
    outPutStream.SetLevel(compressLevel); // 0 - store only to 9 - means best compression
    foreach (string file in files)
    {
        FileStream fileStream = System.IO.File.OpenRead(file);//打開壓縮文件
        byte[] buffer = new byte[fileStream.Length];
        fileStream.Read(buffer, 0, buffer.Length);
        ZipEntry entry = new ZipEntry(file.Replace(rootMark, string.Empty));
        entry.DateTime = DateTime.Now;
        entry.Size = fileStream.Length;
        fileStream.Close();
        crc.Reset();
        crc.Update(buffer);
        entry.Crc = crc.Value;
        outPutStream.PutNextEntry(entry);
        outPutStream.Write(buffer, 0, buffer.Length);
    }

    this.files.Clear();

    foreach (string emptyPath in paths)
    {
        ZipEntry entry = new ZipEntry(emptyPath.Replace(rootMark, string.Empty) + "/");
        outPutStream.PutNextEntry(entry);
    }

    this.paths.Clear();
    outPutStream.Finish();
    outPutStream.Close();
    GC.Collect();
}

調用方法

ZipFileFromDirectory("你要壓縮的目錄路徑", "你要壓縮的壓縮包路徑.zip(保存路徑)", "壓縮程度,范圍0-9,數值越大,壓縮程序越高");


轉載請說明出處:原文鏈接 http://www.yixcsu.live/hdjs/184
標簽: C#

相關閱讀:

搭建IIS網站時候報錯在唯一密鑰屬性“fileExtension”設置為“.woff”時,無法添加類型為“mimeMap”的重復集合項

'OFFSET' 附近有語法錯誤。 在 FETCH 語句中選項 NEXT 的用法無效。

C#分割參數Split中使用StringSplitOptions.RemoveEmptyEntries去除空的數據

.NET的ConcurrentDictionary,線程安全集合類

大乐透专家预测 南京麻将三打四包规则 农村的地种什么赚钱快 三国麻将攻城 今日竞彩比分推荐 有哪些网络赚钱的方式 微信赚钱可以找回吗 训营网球比分 恒发彩票群 现在开健身房赚钱不 精装修是开发商赚钱手段吗 大赢家即时比分大赢家体育 蜀门道具赚钱 英国皇室怎么赚钱 球探即时篮球比分 捕鱼达人3 梦幻西游4开怎么赚钱攻略