環境:
- window 10
- .netcore 3.1.1
- .netframework 4.5
- vs2019 16.5.0
第一步:引入nuget包:SharpZipLib
第二步:編寫幫助類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;
}
#region 壓縮文件
/// <summary>
/// 壓縮文件
/// </summary>
/// <param name="dest">目的文件,如: c:\test.zip</param>
/// <param name="fileAbsPaths">文件來源列表,如: c:\test.txt,d:\test.db</param>
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);
}
}
/// <summary>
/// 遞歸壓縮文件夾
/// </summary>
/// <param name="dest">目的文件名稱,如: c:\test.zip</param>
/// <param name="folderPaths">壓縮的目錄列表,如: c:\test,d:\jack</param>
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();
}
}
#endregion
#region 解壓縮文件
/// <summary>
/// 解壓縮文件到指定文件夾
/// </summary>
/// <param name="srcZipFile">源壓縮文件</param>
/// <param name="destDir">目標文件夾</param>
/// <returns></returns>
public static void UnZipFile(string srcZipFile, string destDir)
{
//讀取壓縮文件(zip文件),準備解壓縮
ZipInputStream inputstream = new ZipInputStream(File.OpenRead(srcZipFile.Trim()));
ZipEntry entry;
string path = destDir;
//解壓出來的文件保存路徑
string rootDir = "";
//根目錄下的第一個子文件夾的名稱
while ((entry = inputstream.GetNextEntry()) != null)
{
rootDir = Path.GetDirectoryName(entry.Name);
//得到根目錄下的第一級子文件夾的名稱
if (rootDir.IndexOf("\\") >= 0)
{
rootDir = rootDir.Substring(0, rootDir.IndexOf("\\") + 1);
}
string dir = Path.GetDirectoryName(entry.Name);
//得到根目錄下的第一級子文件夾下的子文件夾名稱
string fileName = Path.GetFileName(entry.Name);
//根目錄下的文件名稱
if (dir != "")
{
//創建根目錄下的子文件夾,不限制級別
if (!Directory.Exists(destDir + "\\" + dir))
{
path = destDir + "\\" + dir;
//在指定的路徑創建文件夾
Directory.CreateDirectory(path);
}
}
else if (dir == "" && fileName != "")
{
//根目錄下的文件
path = destDir;
}
else if (dir != "" && fileName != "")
{
//根目錄下的第一級子文件夾下的文件
if (dir.IndexOf("\\") > 0)
{
//指定文件保存路徑
path = destDir + "\\" + dir;
}
}
if (dir == rootDir)
{
//判斷是不是需要保存在根目錄下的文件
path = destDir + "\\" + rootDir;
}
//以下爲解壓zip文件的基本步驟
//基本思路:遍歷壓縮文件裏的所有文件,創建一個相同的文件
if (fileName != String.Empty)
{
FileStream fs = File.Create(path + "\\" + fileName);
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = inputstream.Read(data, 0, data.Length);
if (size > 0)
{
fs.Write(data, 0, size);
}
else
{
break;
}
}
fs.Close();
}
}
inputstream.Close();
}
#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");
}