Как переписать существующий zip файл?

Я сделал следующий способ утилиты для сжатия файлов в моем решении. У меня создалось впечатление, что когда-либо он создавал архив.zip с таким же именем, как и существующий, он перезаписывал бы его. Однако это не похоже на случай, и возникает исключение, указывающее, что файл уже существует.

public static void CompressFile(string zipName, string filePath, string fileName)
{
 try
 {
 using (ZipArchive archive = ZipFile.Open(zipName, ZipArchiveMode.Create))
 {
 archive.CreateEntryFromFile(filePath, fileName, CompressionLevel.Fastest);
 }
 }
 catch(Exception e)
 {
 _log.Error("Exception Caught: {0}", e.Message);
 }
}

Есть ли где-то ошибка, которую я потерял, или мне нужно написать чек, который удалит ранее существовавший архив с тем же именем?

2 ответа

См. Примечания в документации для ZipFile.Open:

Когда вы устанавливаете параметр режима в Create, архив открывается с помощью FileMode.CreateNew в качестве значения режима файла. Если архив уже существует, генерируется исключение IOException. Когда вы устанавливаете параметр режима "Обновление", архив открывается с помощью FileMode.OpenOrCreate в качестве значения режима файла. Если архив существует, он открывается. Существующие записи могут быть изменены и могут быть созданы новые записи. Если архив не существует, создается новый архив; однако создание zip-архива в режиме обновления не так эффективно, как создание его в режиме создания.

Таким образом, проблема сводится к основной обработке файлов. Когда вы используете Create как ZipArchiveMode, API неявно пытается создать файл без обработки его уже существующего. В вашем случае Update ZipArchiveMode, вероятно, более уместно. Перечисление FileMode более подробно описывает то, что позволяет и требует каждое значение, упомянутое выше.

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


Простой - удалите zip, прежде чем писать на него. Если бы этого не существовало раньше - никакого вреда.

В целях безопасности вы также можете сначала создать новый, а затем переместить его поверх старого с помощью команды force.

Согласно: https://msdn.microsoft.com/en-us/library/system.io.compression.ziparchive%28v=vs.110%29.aspx

ZipArchive.Open добавляет новые файлы в существующий zip-архив. Обязательно прочтите документы, чтобы убедиться, что вы используете правильный метод!

Натан

licensed under cc by-sa 3.0 with attribution.