Использование SharpZipLib для обновления zip-файла — что-то плохое, если имя записи включает папку

#c# #zip #sharpziplib

#c# #zip #sharpziplib

Вопрос:

Это мой код для обновления существующего ZIP-файла, вызывающие пользователи передают ZIP-файл и имеют блок finally для закрытия zip-файла.

     private static void AddFiles(ZipFile zipFile, string path, string filesEntryLocation, string pattern = @"*") {

        zipFile.BeginUpdate();

        string[] files = Directory.GetFiles(path, pattern);

        foreach (string filename in files) {
            zipFile.Add(filename, (filesEntryLocation   filename.Split(new[] { '\' }).Last()).Replace('\','/'));
        }



        zipFile.CommitUpdate();
    }
  

Как вы можете видеть, я добавляю записи в zip и устанавливаю имя записи в определенной части иерархии папок zip.

Мы делаем это, чтобы внедрить продукт в веб-пакет «framework» — платформа поддерживает слабо связанные продукты.

Результирующий ZIP-файл в порядке, я могу перемещаться по нему в Windows, я могу его извлечь… НО появляется MSDeploy, и где бы новая запись ни приводила к добавлению в иерархию папок zip, я получаю ошибки от msdeploy, в которых говорится, что не удалось открыть zip-файл, НО только в этом конкретном месте, т. Е. zip не поврежден полностью, только там, где msdeploy начинает навигацию по «новой» папке.

Теперь, если я извлеку измененный zip, а затем повторно заархивирую его (используя 7zip) и попрошу msdeploy выполнить для этого — без проблем, это работает.

ИТАК, это SharpZipLib, или я делаю что-то неправильно при добавлении в иерархию папок zip?

Ответ №1:

Вы также должны добавить записи папки в архив (если они не существовали ранее).