我有很多文件夹,每个文件夹中都有一些文件。 我正在从不同的文件夹中获取一些文件路径,我需要将这些文件压缩成一个zip文件。
如果我将文件放在一个文件夹中,我可以使用
进行压缩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);
using (ZipArchive newFile = ZipFile.Open(zipName, ZipArchiveMode.Create))
{
foreach (string file in Directory.GetFiles(myPath))
{
newFile.CreateEntryFromFile(file);
}
}
假设我不知道文件夹,我只有一个文件路径列表,我需要遍历每个文件路径并添加到zip中。我该怎么做?
答案 0 :(得分:2)
您可以使用Directory.GetFiles
重载和SearchOption.AllDirectories
选项枚举目录包含子目录中的所有文件,然后使用它
String[] allfiles = System.IO.Directory.GetFiles("myPath", "*.*", System.IO.SearchOption.AllDirectories);
foreach (string file in allfiles)
{
newFile.CreateEntryFromFile(file);
}
您可以使用ZipFile.CreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName)
或其重载来一步创建存档。
还有一种方法可以通过Path.GetDirectoryName()
方法更灵活地操作zip存档结构。这是一个例子:
foreach(var filePath in files)
{
var directory = Path.GetDirectoryName(filePath);
var fileName = Path.GetFileName(filePath);
var entry = archive.GetEntryFromFile(filePath, $"{directory}/{fileName}");
}
最后,你可以使用第三方库DotNetZip并只用3行代码解决你的场景:
using (ZipFile zip = new ZipFile())
{
zip.AddFiles(files);
zip.Save("Archive.zip");
}
答案 1 :(得分:1)
使用newget manager中的DotNetZip库,只需检查它是否可行
using (ZipFile zip = new ZipFile())
{
foreach(var filestring in AllFileArray)
{
zip.AddFile(filestring);
}
zip.save("MyZipFile.zip")
}