2012-03-29 64 views
1

我试图找出如何首先检查Dup的键添加错误

在我的循环经历每一个文件我有一个集合,并试图将其添加到收藏使用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)); 
    } 
} 

zip文件类型是从Ionic.Zip.dll

的问题是,AddItem错误了,我得到相同的键的项已被添加。因此,例如到底尝试添加该键这是已经在这个zip字典前面添加:

“C:\ WWW \文件\ 233272个\练习文件\ SampleCode \原件\ MyTest.cs”

我不能进入检查dup工作正常......它stil试图在循环中添加两次。

如何在尝试添加前检查任何文件[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])) 

回答

1

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

快速检查在我的项目后:

zip.ContainsEntry("filename.ext") 

应该做的工作。也是离子ZIP保持List<string>似乎

zip.EntryFileNames 
0

它的长,因为这被张贴,但我有同样的问题,我就是这样做是为了确保在创建新的前一个Zip文件将被删除。我想当你创建一个新的zip文件并且它已经存在时,它就会附加到它。

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

很老的问题,但我需要澄清。本·麦金太尔说得没错。我碰到的问题是我从不同目录添加具有相同名称的文件,因此检查它是否包含使用文件[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)); 
    } 
} 
相关问题