ZipFile对象上的Dup键添加错误

时间:2012-03-29 04:31:48

标签: c# dotnetzip

我正在试图弄清楚如何先检查

在我的循环中浏览我在集合中的每个文件并尝试将其添加到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 \ Exercise Files \ 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]))

3 个答案:

答案 0 :(得分:2)

Qu有点老了,但既然你正在创建空拉链并填充它,为什么不自己跟踪文件名呢? 创建一个List<string>,随时添加每个文件名,然后使用.contains查看您要添加的文件是否已经存在。 您的列表应该是ZIP文件内容的精确镜像。

快速检查我的项目后:

  zip.ContainsEntry("filename.ext")

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

  zip.EntryFileNames

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

很老的问题,但我需要澄清一下。 Ben McIntyre做对了。我遇到的问题是我从不同的目录中添加了相同名称的文件,因此检查它是否包含使用文件[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));
    }
}