如何使用 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 python 压缩文件夹

使用 ZipFile 类从多个文件的 zip 存档中解压缩文件

python 用zipfile对文件进行压缩并加密(不让人解压缩并修改文件)如何实现

python zipfile 文件压缩和文件

python怎样压缩和解压缩ZIP文件

zipfile模块操作zip压缩文件