【问题标题】:How to compress both files and folders with ZipFile API如何使用 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 无法压缩文件夹中文件夹的文件。我想要相同的结构和相同的文件。

标签: c# zip compression zipfile


【解决方案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 我的回答最后帮您解决了问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 2010-12-14
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
  • 1970-01-01
相关资源
最近更新 更多