ZipFile对象上的重复密钥添加错误

本文关键字:密钥 添加 错误 对象 ZipFile | 更新日期: 2023-09-27 18:29:33

我正在想办法首先检查

在我遍历集合中的每个文件并尝试将其添加到ZipFile集合的循环中,我得到了:

using (var zip = new ZipFile())
{
    foreach(...)
    {
         var tryFile = Directory.
                 GetFiles(fileLocalization, fileName, 
                                             SearchOption.TopDirectoryOnly);
         if (!string.IsNullOrEmpty(file[0]))
              zip.AddItem(file[0], GetPathStructure(file.NameInContainer));
    }
}

ZipFile类型来自Ionic.Zip.dll

问题是AddItem出错,我得到一个具有相同密钥的项目已经添加。例如,最后它试图添加这个已经在这个zip字典中添加的密钥:

"C:''www''files''233272''练习文件''SampleCode''Original''MyTest.cs"

我无法让dup正常工作。。。它仍然试图在循环中添加两次。

在尝试添加之前,如何检查任何文件[0]?我尝试了LINQ .Any(),但如果我可以使用LINQ,就无法获得正确的语法。

我试过了,但我在语法上做得不对:

if (!string.IsNullOrEmpty(tryFile[0]) && !zip.Contains(tryFile[0])

也尝试过

if (!string.IsNullOrEmpty(tryFile[0]) && !zip.Any(zip[tryFile[0]])

也尝试过

if (!string.IsNullOrEmpty(tryFile[0]) && !zip.ContainsEntry(tryFile[0]))

ZipFile对象上的重复密钥添加错误

Qu有点旧,但既然您要创建空的zip并填充它,为什么不自己跟踪文件名呢?创建一个List<string>,在执行过程中向其中添加每个文件名,然后使用.contains查看要添加的文件是否已经在其中。您的列表应该是ZIP文件内容的精确镜像。

在我的项目中快速检查后:

  zip.ContainsEntry("filename.ext")

应该做这项工作。此外,IONIC ZIP保存的List<string>似乎是

  zip.EntryFileNames

这篇文章发布很久了,但我也遇到了同样的问题,我所做的是确保在创建新文件之前删除Zip文件。我认为当你创建一个新的zip并且它已经存在时,它只是附加到它上面

            if (File.Exists(file_name))
            {
                File.Delete(file_name);
            }

这个问题很老,但我需要澄清。本·麦金太尔说得对。我遇到的问题是,我从不同的目录中添加了具有相同名称的文件,因此使用文件[0]检查它是否包含条目将不起作用。您必须获取文件名。我建议使用Path.GetFileName(fullPath);

using (var zip = new ZipFile())
{
    foreach(...)
    {
         var tryFile = Directory.
             GetFiles(fileLocalization, fileName, 
                                         SearchOption.TopDirectoryOnly);
         var fileName = Path.GetFileName(file[0]);
         if (!string.IsNullOrEmpty(file[0]) && !zip.ContainsEntry(fileName))
             zip.AddItem(file[0], GetPathStructure(file.NameInContainer));
    }
}