1、使用ZipArchive类实现解压.zip包中指定文件夹中内容并压缩
解压source-file.zip中dist文件夹下的所有内容压缩存储在destination-file.zip中。
using (MemoryStream srcMemoryStream = new MemoryStream())
{
using (MemoryStream targetMemoryStream = new MemoryStream())
{
// 为了得到一个字节数组,我只需读取一个文件并将其存储到memory stream
using (FileStream sourceZipFile = new FileStream(@"f:\source-file.zip", FileMode.Open))
{
sourceZipFile.CopyTo(srcMemoryStream);
}
using (ZipArchive srcArchive = new ZipArchive(srcMemoryStream, ZipArchiveMode.Read))
{
using (ZipArchive destArchive = new ZipArchive(targetMemoryStream, ZipArchiveMode.Create, true))
{
srcArchive.Entries
.Where(entry => entry.FullName.Contains("dist/"))
.ToList()
.ForEach((entry) =>
{
//我只是在其他归档文件中创建具有相同结构的相同文件夹
//如果你想改变结构,你必须重命名或删除部分
//路径如下
/// var newEntryName = entry.FullName.Replace("files/dist/", "new-dist/");
/// ZipArchiveEntry newEntry = destArchive.CreateEntry(newEntryName);
ZipArchiveEntry newEntry = destArchive.CreateEntry(entry.FullName);
using (Stream srcEntry = entry.Open())
{
using (Stream destEntry = newEntry.Open())
{
srcEntry.CopyTo(destEntry);
}
}
});
}
}
//写了压缩文件在磁盘上,以确保它的工作
//在这行代码之前,结果字节数组在targetMemoryStream内存流中
using (FileStream fs = new FileStream(@"f:/destination-file.zip", FileMode.Create))
{
targetMemoryStream.WriteTo(fs);
targetMemoryStream.Flush();
fs.Flush(true);
}
}
}
2、创建.zip文件
创建新条目并使用流对其进行写入。
using System;
using System.IO;
using System.IO.Compression;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
using (FileStream zipToOpen = new FileStream(@"c:\users\exampleuser\release.zip", FileMode.Open))
{
using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
{
ZipArchiveEntry readmeEntry = archive.CreateEntry("Readme.txt");
using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
{
writer.WriteLine("Information about this package.");
writer.WriteLine("========================");
}
}
}
}
}
}
3、解压.zip文件
打开zip归档文件并遍历条目集合。
using System;
using System.IO;
using System.IO.Compression;
class Program
{
static void Main(string[] args)
{
string zipPath = @".\result.zip";
Console.WriteLine("Provide path where to extract the zip file:");
string extractPath = Console.ReadLine();
// Normalizes the path.
extractPath = Path.GetFullPath(extractPath);
// 确保提取路径上的最后一个字符
//是目录分隔符char。
//如果没有这个,恶意的zip文件可能会试图在预期的范围之外遍历
//提取路径。
if (!extractPath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal))
extractPath += Path.DirectorySeparatorChar;
using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
if (entry.FullName.EndsWith(".txt", StringComparison.OrdinalIgnoreCase))
{
// 获取完整路径,以确保删除了相关段。
string destinationPath = Path.GetFullPath(Path.Combine(extractPath, entry.FullName));
//序号匹配是最安全的,区分大小写的卷可以装入
//是不区分大小写的。
if (destinationPath.StartsWith(extractPath, StringComparison.Ordinal))
entry.ExtractToFile(destinationPath);
}
}
}
}
}
4、更新.zip包文件中内容
用扩展方法从现有文件在zip存档中创建新条目并提取存档内容。须引用System.IO.Compression.FileSystem
程序集才能执行代码。
using System;
using System.IO;
using System.IO.Compression;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string zipPath = @"c:\users\exampleuser\start.zip";
string extractPath = @"c:\users\exampleuser\extract";
string newFile = @"c:\users\exampleuser\NewFile.txt";
using (ZipArchive archive = ZipFile.Open(zipPath, ZipArchiveMode.Update))
{
archive.CreateEntryFromFile(newFile, "NewEntry.txt");
archive.ExtractToDirectory(extractPath);
}
}
}
}
5、linux中调用zip和unzip命令实现
使用.Net Core后台代码中调用linux中zip和unzip实例.zip文件压缩和解压
using System;
using System.Diagnostics;
public static class ShellHelper
{
public static string Bash(this string cmd)
{
var escapedArgs = cmd.Replace("\"", "\\\"");
var process = new Process()
{
StartInfo = new ProcessStartInfo
{
FileName = "/bin/bash",
Arguments = $"-c \"{escapedArgs}\"",
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true,
}
};
process.Start();
string result = process.StandardOutput.ReadToEnd();
process.WaitForExit();
return result;
}
}
调用执行命令:
ShellHelper.Bash("zip myfile.zip filename.txt");// 压缩命令:zip myfile.zip filename.txt 解压命令:unzip file.zip
或者
string command = "zip myfile.zip filename.txt";// 压缩命令:zip myfile.zip filename.txt 解压命令:unzip file.zip
string result = "";
using (System.Diagnostics.Process proc = new System.Diagnostics.Process())
{
proc.StartInfo.FileName = "/bin/bash";
proc.StartInfo.Arguments = "-c \" " + command + " \"";
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.RedirectStandardError = true;
proc.Start();
result += proc.StandardOutput.ReadToEnd();
result += proc.StandardError.ReadToEnd();
proc.WaitForExit();
}
return result;
备注:
处理zip存档及其文件条目的方法分布在三个类中:ZipFile,ZipArchive和ZipArchiveEntry。
ZipFile.CreateFromDirectory:从目录创建zip存档。
ZipFile.ExtractToDirectory:将zip存档的内容提取到目录中。
ZipArchive.CreateEntry:将新文件添加到现有的zip存档中。
ZipArchive.GetEntry:从zip存档中检索文件。
ZipArchive.Entries:从zip存档中检索所有文件。
ZipArchiveEntry.Open:将流打开到zip存档中包含的单个文件。
ZipArchiveEntry.Delete:从zip存档中删除文件。
相关文档:.NET Core(C#)使用sharpcompress压缩解压文件(.rar,.zip,tar.bz2,.7z,.tar.gz)