Ошибка добавления ключа Dup для объекта ZipFile - PullRequest
1 голос
/ 29 марта 2012

Я пытаюсь выяснить, как сначала проверить, что

В моем цикле, просматривая каждый файл в коллекции и пытаясь добавить его в коллекцию 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]))

Ответы [ 3 ]

2 голосов
/ 06 июня 2012

Qu немного староват, но так как вы создаете пустой zip-файл и заполняете его, почему бы не отследить имена файлов самостоятельно? Создайте List<string>, добавляйте к нему каждое имя файла и используйте .contains, чтобы увидеть, существует ли уже файл, который вы собираетесь добавить. Ваш список должен быть точным отражением содержимого файла ZIP.

После быстрой проверки в моем проекте:

  zip.ContainsEntry("filename.ext")

должен сделать работу. Кроме того, List<string>, который хранит IONIC ZIP, выглядит как

  zip.EntryFileNames
0 голосов
/ 01 декабря 2014

Довольно старый вопрос, но мне нужно уточнить.Бен Макинтайр понял это правильно.Проблема, с которой я столкнулся, заключалась в том, что я добавлял файлы из разных каталогов с одинаковыми именами, поэтому проверка на наличие записи с использованием файла [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));
    }
}
0 голосов
/ 11 декабря 2012

Это давно, так как это было опубликовано, но у меня была та же проблема, что я сделал, чтобы убедиться, что файл Zip удален, прежде чем создавать новый. Я думаю, что когда вы создаете новый почтовый индекс, и он уже существует, он просто добавляется к нему.

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