我正在试图弄清楚如何先检查
在我的循环中浏览我在集合中的每个文件并尝试将其添加到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]))
答案 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));
}
}