今天来介绍一个C#自带的类ZipFile,这个类主要负责压缩和解压。它有两个非常简单的方法CreateFromDirectoryExtractToDirectory

CreateFromDirectory:负责将一个文件夹压缩成一个压缩文件。

ExtractToDirectory :负责将一个压缩文件解压到指定的目录。

以上两个方法并不能实时显示压缩的进度,如果压缩的文件比较小,对进度没有要求,可以使用这两个文件,因为这是最方便快捷的。

不过我们这篇文章主要介绍如何使用这个类来精细化的控制压缩进度和解压进度。

我在这里使用一个WPF项目来演示如何压缩文件并实时显示进度,具体代码如下:

private void Button_Click(object sender, RoutedEventArgs e)
{
    Task.Run(() =>
    {
        string dir = "D:\\wwwroot\\site.admin.com";//即将要压缩的目录
        string zipFile = "D:\\www.zip";//最重要压缩的文件
        if (File.Exists(zipFile))
        {
            File.Delete(zipFile);
        }

        string[] files = Directory.GetFiles(dir);

        var zip = ZipFile.Open(zipFile, ZipArchiveMode.Create);

        int total = files.Length;
        int current = 0;
        foreach (string file in files)
        {
            Thread.Sleep(100);
            current++;
            Dispatcher.Invoke(() =>
            {
                desc.Text = $"{total}/{current} 正在压缩{file}.....";
                processBar.Value = (int)((current / (decimal)total) * 100);
            });

            zip.CreateEntryFromFile(file, System.IO.Path.GetFileName(file));
        }

        zip.Dispose();
    });

}

以上代码比较多,我们把最重要的地方给大家列出来:

1、ZipArchive zip = ZipFile.Open(zipFile, ZipArchiveMode.Create); ZipFile的Open方法用于创建一个ZipArchive 对象,该对象用于压缩和解压。

2、zip.CreateEntryFromFile(file, System.IO.Path.GetFileName(file)); ZipArchive CreateEntryFromFile方法用于将一个指定的文件写入压缩文件,这是实现压缩进度的关键。假设我们有一百个文件,执行一次这个方法就相当于是往压缩文件中压缩了一个文件。

3、zip.Dispose();压缩完成之后,一定要记得释放掉这个对象,否则压缩的.zip压缩文件将会被占用无法打开,压缩出来的文件有可能会异常。