C#使用自带类库实现压缩文件、解压文件

网上有很多压缩和解压的第三方类库,下面代码是使用C#自带类库实现的文件压缩解压。

注意在用c#自带的类库实现文件压缩和解压的时候需要添加下面的引用:
using System.IO;

using System.IO.Compression;

System.IO.Compression.FileSystem;

自己封装的帮助类:

 

    public class ZipHelper
    {
        /// <summary>
        /// 压缩单文件
        /// </summary>
        /// <param name="filePath">文件路径</param>
        /// <param name="savePath">压缩包路径</param>
        /// <param name="isReserved">是否保存原文件</param>
        public static void CompressSingleFile(string filePath, string savePath, bool isReserved = true)
        {
            if (!File.Exists(filePath))
            {
                throw new FileNotFoundException($"{filePath}不存在.");
            }
            FileInfo file = new FileInfo(filePath);
            string filename = Path.GetFileNameWithoutExtension(filePath);
            string tempDir = Path.Combine(file.DirectoryName, "temp_Zip");
            if (!File.Exists(tempDir))
            {
                Directory.CreateDirectory(tempDir);
            }
            //默认保留原文件
            if (isReserved)
            {
                file.CopyTo(Path.Combine(tempDir, file.Name));
            }
            else
            {
                file.MoveTo(Path.Combine(tempDir, file.Name));
            }
            ZipFile.CreateFromDirectory(tempDir, savePath);
            DeleteDir(tempDir);
        }

        /// <summary>
        /// 压缩文件夹
        /// </summary>
        /// <param name="dirPath">文件夹路径</param>
        /// <param name="savePath">压缩包路径</param>
        /// <param name="isReserved">是否保存原文件</param>
        public static void CompressSingleDir(string dirPath, string savePath, bool isReserved = true)
        {
            ZipFile.CreateFromDirectory(dirPath, savePath);
            if (!isReserved)
            {
                DeleteDir(dirPath);
            }
        }

        /// <summary>
        /// 多文件压缩
        /// </summary>
        /// <param name="filePaths">文件夹路径数组</param>
        /// <param name="savePath">压缩包路径</param>
        /// <param name="isReserved">是否保存原文件</param>
        public static void CompressMultiFile(string[] filePaths, string savePath, bool isReserved = true)
        {
            string tempDir = Path.Combine(Path.GetDirectoryName(savePath), "temp_Zip");
            if (!File.Exists(tempDir))
            {
                Directory.CreateDirectory(tempDir);
            }
            foreach (string filePath in filePaths)
            {
                if (!File.Exists(filePath))
                {
                    throw new FileNotFoundException($"{filePath}不存在.");
                }
                FileInfo file = new FileInfo(filePath);
                string filename = Path.GetFileNameWithoutExtension(filePath);
                //默认保留原文件
                if (isReserved)
                {
                    file.CopyTo(Path.Combine(tempDir, file.Name));
                }
                else
                {
                    file.MoveTo(Path.Combine(tempDir, file.Name));
                }
            }
            ZipFile.CreateFromDirectory(tempDir, savePath);
            DeleteDir(tempDir);
        }

        /// <summary>
        /// 文件解压
        /// </summary>
        /// <param name="zipPath">压缩包路径</param>
        /// <param name="saveDir">解压保存文件夹</param>
        /// <param name="isReserved">是否保存压缩包</param>
        public static void DeCompressMulti(string zipPath, string saveDir, bool isReserved = true)
        {
            ZipFile.ExtractToDirectory(zipPath, saveDir);
            if(!isReserved)
            {
                File.Delete(zipPath);
            }
        }
        /// <summary>
        /// 删除文件夹及文件夹下文件
        /// </summary>
        /// <param name="dirPath">文件夹路径</param>
        private static void DeleteDir(string dirPath)
        {
            //去除文件夹和子文件的只读属性
            //去除文件夹的只读属性
            DirectoryInfo fileInfo = new DirectoryInfo(dirPath);
            fileInfo.Attributes = FileAttributes.Normal & FileAttributes.Directory;
            //去除文件的只读属性
            File.SetAttributes(dirPath, FileAttributes.Normal);
            //判断文件夹是否还存在
            if (Directory.Exists(dirPath))
            {
                foreach (string file in Directory.GetFileSystemEntries(dirPath))
                {
                    if (File.Exists(file))
                    {
                        //如果有子文件删除文件
                        File.Delete(file);
                    }
                    else
                    {
                        //循环递归删除子文件夹
                        DeleteDir(file);
                    }
                }
                //删除空文件夹
                Directory.Delete(dirPath);
            }
        }
    }

调用方式:

        static void Main(string[] args)
        {
            string[] arr = new string[3] { @"D:\Projects\Test\Data\1.txt", @"D:\Projects\Test\Data\2.txt", @"D:\Projects\Test\Data\3.txt" };
            ZipHelper.CompressSingleFile(@"D:\Projects\Test\Data\1.txt", @"D:\Projects\Test\Data\1.zip", false);
            ZipHelper.CompressSingleDir(@"D:\Projects\Test\Data", @"D:\Projects\Test\Data.zip");
            ZipHelper.CompressMultiFile(arr, @"D:\Projects\Test\Data.zip",false);
            ZipHelper.DeCompressMulti(@"D:\Projects\Test", @"D:\Projects\Test\Data.zip");
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值