2

我试图弄清楚如何首先检查

在遍历集合中的每个文件并尝试将其添加到 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,我尝试LINQ .Any()了但无法获得正确的语法。

我试过了,但我在语法上没有这样做:

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]))
4

3 回答 3

3

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

快速检查我的项目后:

  zip.ContainsEntry("filename.ext")

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

  zip.EntryFileNames
于 2012-06-06T06:02:24.777 回答
0

很老的问题,但我需要澄清一下。本·麦金太尔是对的。我遇到的问题是我正在从不同目录添加具有相同名称的文件,因此检查它是否包含使用 file[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));
    }
}
于 2014-12-01T16:29:36.303 回答
0

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

            if (File.Exists(file_name))
            {
                File.Delete(file_name);
            }
于 2012-12-11T12:45:28.040 回答