如何使用 ZipFile API 压缩文件和文件夹
Posted
技术标签:
【中文标题】如何使用 ZipFile API 压缩文件和文件夹【英文标题】:How to compress both files and folders with ZipFile API 【发布时间】:2019-08-20 08:27:29 【问题描述】:我想将 Zip 压缩为与文件夹相同的结构。 但是,ZipFile API 似乎无法压缩文件夹。
如何压缩这些文件夹结构?
以下代码无法压缩文件夹本身。
using (ZipArchive archive = ZipFile.Open(Path.Combine(m_strWorkingDirectory, "build.zip"), ZipArchiveMode.Create))
foreach( string path in m_listTargetPath )
string strPath = Path.Combine(m_strWorkingDirectory, path);
archive.CreateEntryFromFile(strPath, path);
【问题讨论】:
我想你只需要 ZipFile.CreateFromDirectory(startPath, zipPath); @andyb952 ZipFile.CreateFromDirectory 无法压缩文件夹中文件夹的文件。我想要相同的结构和相同的文件。 【参考方案1】:如果 ZipFile.CreateFromDirectory() 不能满足您的需求(我认为它会),那么您只需获取您需要的所有文件/文件夹并使用扩展方法添加它们:
public static class FileExtensions
public static IEnumerable<FileSystemInfo> AllFilesAndFolders(this DirectoryInfo dir)
foreach (var f in dir.GetFiles())
yield return f;
foreach (var d in dir.GetDirectories())
yield return d;
foreach (var o in AllFilesAndFolders(d))
yield return o;
然后使用相同的格式,您应该能够执行类似的操作(未测试):
DirectoryInfo dir = new DirectoryInfo(m_strWorkingDirectory);
using (ZipArchive archive = ZipFile.Open(Path.Combine(m_strWorkingDirectory, "build.zip"), ZipArchiveMode.Create))
foreach (FileInfo file in dir.AllFilesAndFolders().Where(o => o is FileInfo).Cast<FileInfo>())
var relPath = file.FullName.Substring(dir.FullName.Length + 1);
archive.CreateEntryFromFile(file.FullName, relPath);
【讨论】:
@dubs 我的回答最后帮您解决了问题吗?以上是关于如何使用 ZipFile API 压缩文件和文件夹的主要内容,如果未能解决你的问题,请参考以下文章
使用 ZipFile 类从多个文件的 zip 存档中解压缩文件