【问题标题】:How can I delete a directory in a Zip file using .NET?如何使用 .NET 删除 Zip 文件中的目录?
【发布时间】:2012-03-24 20:09:00
【问题描述】:

如何删除 .zip 中的目录及其中的所有文件(最好使用 DotNetZip)?

现在我正在浏览 zip 中的所有文件,但它不起作用:

foreach (ZipEntry e in zip)
{
    //If the file is in the directory I want to delete
    if(e.FileName.Substring(0, 9) == "FolderName/")
    {
        zip.RemoveEntry(e.FileName);                          
    }
}

有没有更好的方法,如果没有,我该怎么做?

【问题讨论】:

  • -1 真的吗?我研究了几个小时。我只是被困在这个无法弄清楚......
  • 不禁注意到您检索了一个长度为 9 个字符的子字符串,只是为了将它与 11 个字符之一进行比较,所以它会总是返回 false。 (或者这只是一个示例字符串?)

标签: c# dotnetzip


【解决方案1】:

这是一个简单的方法:

using (ZipFile zip = ZipFile.Read(@"C:\path\to\MyZipFile.zip"))
{
    zip.RemoveSelectedEntries("foldername/*"); // Delete folder and its contents
    zip.Save();
}

这里有文档http://dotnetzip.herobo.com/DNZHelp/Index.html

【讨论】:

    【解决方案2】:

    第一条。从集合中删除元素时不要使用 foreach 循环。
    我会这样尝试

    for(int x = zip.Count -1; x >= 0; x--) 
    { 
        ZipEntry e = zip[x];
        if(e.FileName.Substring(0, 9) == "FolderName/") 
            zip.RemoveEntry(e.FileName);                           
    } 
    

    但是,查看 ZipFile 类的方法,我注意到了该方法: 返回 ICollection 的 SelectEntries。所以我认为可以这样做:
    编辑:使用重载版本 SelectEntries(string,string)

    var selection = zip1.SelectEntries("*.*", "FolderName");
    for(x = selection.Count - 1; x >= 0; x--)
    {
        ZipEntry e = selection[x];
        zip.RemoveEntry(e.FileName);                           
    }
    

    删除压缩文件中所有条目的循环

    【讨论】:

    • 效果很好。为什么你认为我的失败? (另外,如果可能的话,现在有办法删除文件夹吗?)
    • 如果您在枚举集合时从集合中删除了一个项目,那么您会遇到问题也就不足为奇了。这种相当简洁的方法按索引以相反的顺序遍历集合,从而避免了该问题。
    • @Chris 当您尝试删除文件时遇到了什么错误?
    • 我爱你们,哈哈。非常感谢!
    • 删除文件夹?没有必要。如果我没记错的话,删除所有“文件夹名/*.*”文件会导致“文件夹”消失
    【解决方案3】:

    可以如下实现

    using (ZipArchive zip = ZipFile.Open(@"C:\path\to\MyZipFile.zip", ZipArchiveMode.Update))
    {
        zip.Entries.Where(x => x.FullName.Contains("Foldername")).ToList()
            .ForEach(y =>
            {
                zip.GetEntry(y.FullName).Delete();
            });
    }
    

    注意:如果文件夹中的所有文件都被删除,则文件夹将被自动删除。

    【讨论】:

      【解决方案4】:

      为了删除目录和所有嵌套的子条目,我使用了

      var sel = (from x in zip.Entries where x.FileName.StartsWith(path, StringComparison.OrdinalIgnoreCase) select x.FileName).ToList();
      foreach (var fn in sel)
      {
           zip.RemoveEntry(fn);
      }
      

      注意路径必须以斜线结尾,如dir/subdir/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 2011-01-14
        相关资源
        最近更新 更多