我正在尝试从一个文件夹中的所有文件创建一个zip文件,但是在网上找不到任何相关的片段。我想做这样的事情:
DirectoryInfo dir = new DirectoryInfo("somedir path");
ZipFile zip = new ZipFile();
zip.AddFiles(dir.getfiles());
zip.SaveTo("some other path");
非常感谢您的帮助。
编辑:我只想压缩文件夹中的文件,而不是它的子文件夹。
在您的项目中引用 System.IO.Compression 和 System.IO.Compression.FileSystem
using System.IO.Compression;
string startPath = @"c:\example\start";//folder to add
string zipPath = @"c:\example\result.zip";//URL for your ZIP file
ZipFile.CreateFromDirectory(startPath, zipPath, CompressionLevel.Fastest, true);
string extractPath = @"c:\example\extract";//path to extract
ZipFile.ExtractToDirectory(zipPath, extractPath);
仅使用文件,请使用:
//Creates a new, blank zip file to work with - the file will be
//finalized when the using statement completes
using (ZipArchive newFile = ZipFile.Open(zipName, ZipArchiveMode.Create))
{
foreach (string file in Directory.GetFiles(myPath))
{
newFile.CreateEntryFromFile(file, System.IO.Path.GetFileName(file));
}
}
在您的项目中引用System.IO.Compression
和System.IO.Compression.FileSystem
,您的代码可能如下:
string startPath = @"some path";
string zipPath = @"some other path";
var files = Directory.GetFiles(startPath);
using (FileStream zipToOpen = new FileStream(zipPath, FileMode.Open))
{
using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create))
{
foreach (var file in files)
{
archive.CreateEntryFromFile(file, file);
}
}
}
在某些文件夹中,您可能会遇到权限问题。
为了使您的zipfile在UNIX系统上可移植,您应该注意以下内容:
例如,可以使用mod“644”:
var entry = newFile.CreateEntryFromFile(file, file);
entry.ExternalAttributes |= (Convert.ToInt32("644", 8) << 16);
这不需要循环。对于VS2019 + .NET FW 4.7+,可以这样做...
https://www.nuget.org/packages/40-System.IO.Compression.FileSystem/
然后使用:
using System.IO.Compression;
例如,下面的代码片段将打包和解压目录(使用 false 避免打包子目录)
string zippedPath = "c:\\mydir"; // folder to add
string zipFileName = "c:\\temp\\therecipes.zip"; // zipfile to create
string unzipPath = "c:\\unpackedmydir"; // URL for ZIP file unpack
ZipFile.CreateFromDirectory(zippedPath, zipFileName, CompressionLevel.Fastest, true);
ZipFile.ExtractToDirectory(zipFileName, unzipPath);