C# 压缩与解压操作

发布时间 2023-04-03 10:57:51作者: wu.g.q

依赖:.NET Framework 4.5及以上,引用 - 添加引用 - 程序集
System.IO.Compression
System.IO.Compression.FileSystem

 

针对文件夹的最简单的压缩与解压缩
1、目录必须存在
2、无法覆盖文件

 

public static void DoZipFile(List<string> AllFiles, string FileDir, string OutputDir)
        {
            if (!Regex.IsMatch(FileDir, @".*[/\\]$"))
            {
                FileDir += "\\";
            }

            using (FileStream fs = new FileStream(OutputDir, FileMode.Create))
            {
                using (ZipArchive ar = new ZipArchive(fs, ZipArchiveMode.Create))
                {
                    foreach (string file in AllFiles)
                    {
                        FileInfo info = new FileInfo(file);
                        if(!new DirectoryInfo(FileDir).FullName.StartsWith(info.Directory.FullName))
                        {
                            throw new Exception("Compress file must exist in the specific directory");
                        }

                        ar.CreateEntryFromFile(info.FullName, info.FullName.Substring(FileDir.Length));
                    }
                }
            }
        }

        public static void UnZipFile(string ZipFile, string OutputPath)
        {
            if (!Regex.IsMatch(OutputPath, @".*[/\\]$"))
            {
                OutputPath += "\\";
            }

            using (FileStream fs = new FileStream(ZipFile, FileMode.Open))
            {
                using (ZipArchive zr = new ZipArchive(fs))
                {
                    foreach (var en in zr.Entries)
                    {
                        FileInfo path = new FileInfo(OutputPath + en.FullName);
                        
                        if(!path.Directory.Exists)
                        {
                            path.Directory.Create();
                        }

                        if(en.Name == "") //是文件夹
                        {
                            Directory.CreateDirectory(OutputPath + en.FullName);
                        }
                        else
                        {
                            en.ExtractToFile(OutputPath + en.FullName, true);
                        }
                    }
                }
            }

        }