c#压缩和解压缩文件

环境:

  • window 10
  • .netcore 3.1.1
  • .netframework 4.5
  • vs2019 16.5.0
第一步:引入nuget包:SharpZipLib
<ItemGroup>
	<PackageReference Include="SharpZipLib" Version="1.2.0" />
ItemGroup>

c#压缩和解压缩文件_第1张图片

第二步:编写帮助类ZipHelper
using ICSharpCode.SharpZipLib.Zip;
using System;
using System.IO;
using System.Text;

namespace HttpUpAndDownloadFile
{
    public static class ZipHelper
    {
        static ZipHelper()
        {
            //消除文件名中文乱码
            ICSharpCode.SharpZipLib.Zip.ZipStrings.CodePage = Encoding.UTF8.CodePage;
            //旧版本
            //ICSharpCode.SharpZipLib.Zip.ZipConstants.DefaultCodePage = Encoding.UTF8.CodePage;
        }

        #region 压缩文件
        /// 
        /// 压缩文件
        /// 
        /// 目的文件,如: c:\test.zip
        /// 文件来源列表,如: c:\test.txt,d:\test.db
        public static void ZipFile(string dest, params string[] fileAbsPaths)
        {
            using (var fs = new FileStream(dest, FileMode.Create))
            {
                var zipOutputStream = new ZipOutputStream(fs);
                foreach (var i in fileAbsPaths)
                {
                    ZipSingleFile(zipOutputStream, i);
                };
                zipOutputStream.Finish();
                zipOutputStream.Close();
            }
        }

        private static void ZipSingleFile(ZipOutputStream zipOutputStream, string filePath, string folderName = "")
        {
            var fileInfo = new FileInfo(filePath);
            string fileName = Path.Combine(folderName, fileInfo.Name);
            ZipEntry zipEntry = new ZipEntry(Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(fileName)));
            zipEntry.DateTime = DateTime.Now;
            zipEntry.Size = fileInfo.Length;
            zipOutputStream.PutNextEntry(zipEntry);
            using (var fs = new FileStream(fileInfo.FullName, FileMode.Open))
            {
                fs.CopyTo(zipOutputStream);
            }
        }

        private static void ZipSingleFolder(ZipOutputStream zipOutputStream, string folderPath, string folderName = "")
        {
            string[] directorys = Directory.GetDirectories(folderPath);
            foreach (var i in directorys)
            {
                var tmp = Path.Combine(folderName, new DirectoryInfo(i).Name);
                ZipSingleFolder(zipOutputStream, i, tmp);
            }
            string[] files = Directory.GetFiles(folderPath);
            foreach (var i in files)
            {
                ZipSingleFile(zipOutputStream, i, folderName);
            }
        }

        /// 
        /// 递归压缩文件夹
        /// 
        /// 目的文件名称,如: c:\test.zip
        /// 压缩的目录列表,如: c:\test,d:\jack
        public static void ZipFolder(string dest, params string[] folderPaths)
        {
            using (var fs = new FileStream(dest, FileMode.Create))
            {
                var zipOutputStream = new ZipOutputStream(fs);
                foreach (var i in folderPaths)
                {
                    ZipSingleFolder(zipOutputStream, i, new DirectoryInfo(i).Name);
                };
                zipOutputStream.Finish();
                zipOutputStream.Close();
            }
        }
        
		/// 
        /// 递归压缩文件夹里的内容,不包含文件夹本身(区别:ZipFolder() )
        /// 
        /// 目的文件名称,如: c:\test.zip
        /// 压缩的目录列表,如: c:\test
        public static void ZipFolderContent(string dest, string folderPath)
        {
            using (var fs = new FileStream(dest, FileMode.Create))
            {
                var zipOutputStream = new ZipOutputStream(fs);
                string[] directorys = Directory.GetDirectories(folderPath);
                foreach (var i in directorys)
                {
                    var tmp = Path.Combine(new DirectoryInfo(i).Name);
                    ZipSingleFolder(zipOutputStream, i, tmp);
                }
                string[] files = Directory.GetFiles(folderPath);
                foreach (var i in files)
                {
                    ZipSingleFile(zipOutputStream, i);
                }
                zipOutputStream.Finish();
                zipOutputStream.Close();
            }
        }
        #endregion

        #region 解压缩文件
        /// 
        /// 解压缩文件到指定文件夹
        /// 
        /// 源压缩文件
        /// 目标文件夹
        /// 
        public static void UnZipFile(string srcZipFile, string destDir)
        {
            if (!Directory.Exists(destDir)) Directory.CreateDirectory(destDir);
            using (var stream = new ZipInputStream(File.OpenRead(srcZipFile.Trim())))
            {
                ZipEntry entry;
                while ((entry = stream.GetNextEntry()) != null)
                {
                    if (entry.IsDirectory)
                    {
                        //目录,创建新目录即可
                        var path = Path.Combine(destDir, entry.Name);
                        if (!Directory.Exists(path)) Directory.CreateDirectory(path);
                        continue;
                    }
                    else if (entry.IsFile)
                    {
                        //文件,将文件解压缩
                        var path = Path.Combine(destDir, entry.Name);
                        var dir = Path.GetDirectoryName(path);
                        if (!Directory.Exists(dir)) Directory.CreateDirectory(dir);
                        using (var fs = File.Create(path))
                        {
                            int size = 2048;
                            byte[] data = new byte[2048];
                            while (true)
                            {
                                size = stream.Read(data, 0, data.Length);
                                if (size > 0)
                                {
                                    fs.Write(data, 0, size);
                                }
                                else
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
        #endregion

    }
}
第三步:测试
private static void TestUnZipFile()
{
    ZipHelper.UnZipFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestZipFolder.zip"), @"C:\Users\AUAS\Desktop\test22");
}
private static void TestZipFolder()
{
    ZipHelper.ZipFolder(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestZipFolder.zip"), @"C:\Users\AUAS\Desktop\test", @"E:\jackletter\codes\图纸项目\测试提取图名");
}
private static void TestZipFile()
{
    ZipHelper.ZipFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestZipFile.zip"), @"C:\Users\AUAS\Desktop\test\testupload.db", @"C:\Users\AUAS\Desktop\test\b\testupload.txt");
}

你可能感兴趣的:(c#,.net)