"Коллекция была изменена; невозможно выполнить операцию перечисления."

Я получаю в массив строк files прямой путь до файла(ов) по средствам DragDrop на форму.

string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);

С помощью foreach хочу вывести все эти файлы в listBox

foreach (string file in files)
{
    listBox1.Items.Add(file);     
}

Задача естественно не такая простая. Каждый файл представляет собой архив с данными. Мне требуется открыть этот архив, для записи, и переименовать нужный мне файл - сохранить.

Что я собственно и попытался сделать с помощью библиотеки DotNetZip. Я использовал за основу решения, пример из документации, вот что вышло:

            string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
            foreach (string file in files)
            {                    
                using (ZipFile zip = ZipFile.Read(file))
                {
                    foreach (ZipEntry z in zip)
                    {
                        if(z.FileName == "folder/setting.ini")
                        {
                            z.FileName = "folder/config.ini";                            
                        }                     
                    }
                    zip.Save();
                }            
                listBox1.Items.Add(file);
            }

На выходе я получаю Ошибку из темы вопроса. Я понимаю что foreach сохраняет коллекцию и сравнивает её на каждом круге(проходе). Но для чего же в документации DotNetZip для изменения файла в архиве используется именно данный пример? Пока жду ответа иду пробовать через for, мб что-то получится.

Примеры решений DotNetZip


Ответы (1 шт):

Автор решения: tomato-magnet-regulato
foreach (ZipEntry z in zip.ToList()) // - Решение
{
    if(z.FileName == "folder/setting.ini")
    {
        z.FileName = "folder/config.ini";
    }                     
}
→ Ссылка