zipfile — Работа с архивами ZIP¶
Исходный код: Lib/zipfile.py.
Формат файла ZIP является распространенным стандартом архивирования и сжатия. Этот модуль предоставляет инструменты для создания, чтения, записи, добавления и вывода списка ZIP-файла. Любое расширенное использование этого модуля потребует понимания формата, определенного в PKZIP Application Note.
В настоящее время этот модуль не работает с многодисковыми ZIP-файлами. Он может работать с ZIP-файлами, использующими расширения ZIP64 (то есть с ZIP-файлами размером более 4 Гб). Он поддерживает расшифровку зашифрованных файлов в ZIP-архивах, но в настоящее время не может создать зашифрованный файл. Расшифровка происходит крайне медленно, поскольку она реализована на родном языке Python, а не C.
Модуль определяет следующие элементы:
-
exception
zipfile.BadZipFile¶ Ошибка, возникающая для плохих ZIP-файлов.
Добавлено в версии 3.2.
-
exception
zipfile.BadZipfile¶ Псевдоним
BadZipFile, для совместимости со старыми версиями Python.Не рекомендуется, начиная с версии 3.2.
-
exception
zipfile.LargeZipFile¶ Ошибка, возникающая, когда ZIP-файл требует функциональности ZIP64, но она не была включена.
-
class
zipfile.ZipFile Класс для чтения и записи файлов ZIP. Подробности о конструкторе см. в разделе Объекты ZipFile.
-
class
zipfile.Path Совместимая с pathlib обертка для zip-файлов. Подробности см. в разделе Объекты пути.
Добавлено в версии 3.8.
-
class
zipfile.PyZipFile Класс для создания ZIP-архивов, содержащих библиотеки Python.
-
class
zipfile.ZipInfo(filename='NoName', date_time=(1980, 1, 1, 0, 0, 0))¶ Класс, используемый для представления информации о члене архива. Экземпляры этого класса возвращаются методами
getinfo()иinfolist()объектовZipFile. Большинству пользователей модуляzipfileне потребуется их создавать, а только использовать те, которые созданы этим модулем. filename должно быть полным именем члена архива, а date_time должен быть кортежем, содержащим шесть полей, которые описывают время последней модификации файла; поля описаны в разделе Объекты ZipInfo.
-
zipfile.is_zipfile(filename)¶ Возвращает
True, если filename является действительным ZIP-файлом на основе его магического номера, в противном случае возвращаетFalse. filename может быть файлом или файлоподобным объектом.Изменено в версии 3.1: Поддержка файлов и файлоподобных объектов.
-
zipfile.ZIP_STORED¶ Числовая константа для несжатого члена архива.
-
zipfile.ZIP_DEFLATED¶ Числовая константа для обычного метода сжатия ZIP. Для этого требуется модуль
zlib.
-
zipfile.ZIP_BZIP2¶ Числовая константа для метода сжатия BZIP2. Для этого требуется модуль
bz2.Добавлено в версии 3.3.
-
zipfile.ZIP_LZMA¶ Числовая константа для метода сжатия LZMA. Для этого требуется модуль
lzma.Добавлено в версии 3.3.
Примечание
Спецификация формата ZIP включает поддержку сжатия bzip2 с 2001 года и LZMA с 2006 года. Однако некоторые инструменты (включая старые версии Python) не поддерживают эти методы сжатия и могут либо вообще отказаться обрабатывать ZIP-файл, либо не извлечь отдельные файлы.
См.также
- PKZIP Application Note
Документация по формату файлов ZIP от Фила Каца, создателя формата и используемых алгоритмов.
- Info-ZIP Home Page
Информация о программах и библиотеках разработки ZIP-архивов проекта Info-ZIP.
Объекты ZipFile¶
-
class
zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=True)¶ Открыть ZIP-файл, где file может быть путем к файлу (строка), файлоподобным объектом или path-like object.
Параметр mode должен быть
'r'для чтения существующего файла,'w'для усечения и записи нового файла,'a'для добавления к существующему файлу или'x'исключительно для создания и записи нового файла. Если mode имеет значение'x'и file ссылается на существующий файл, будет вызвана ошибкаFileExistsError. Если mode имеет значение'a'и file ссылается на существующий ZIP-файл, то к нему добавляются дополнительные файлы. Если file не ссылается на ZIP-файл, то к файлу добавляется новый ZIP-архив. Это предназначено для добавления ZIP-архива к другому файлу (например,python.exe). Если mode равно'a'и файл вообще не существует, то он создается. Если mode равно'r'или'a', файл должен быть доступен для поиска.compression - это метод сжатия ZIP, который будет использоваться при записи архива, и должен быть
ZIP_STORED,ZIP_DEFLATED,ZIP_BZIP2илиZIP_LZMA; нераспознанные значения вызовут запросNotImplementedError. Если указаноZIP_DEFLATED,ZIP_BZIP2илиZIP_LZMA, но соответствующий модуль (zlib,bz2илиlzma) недоступен, будет выдано сообщениеRuntimeError. По умолчанию используетсяZIP_STORED.Если allowZip64 имеет значение
True(по умолчанию), zipfile будет создавать ZIP-файлы, использующие расширения ZIP64, если размер zip-файла превышает 4 ГБ. Если значениеfalsezipfile, то будет возникать исключение, когда ZIP-файл будет требовать расширения ZIP64.Параметр compresslevel управляет уровнем сжатия, который будет использоваться при записи файлов в архив. При использовании
ZIP_STOREDилиZIP_LZMAон не имеет никакого значения. При использованииZIP_DEFLATEDпринимаются целые числа от0до9(см.zlibдля дополнительной информации). При использованииZIP_BZIP2принимаются целые числа от1до9(см.bz2для получения дополнительной информации).Аргумент strict_timestamps, когда он установлен в
False, позволяет застегивать файлы старше 1980-01-01 ценой установки временной метки на 1980-01-01. Аналогичное поведение происходит с файлами новее 2107-12-31, временная метка также устанавливается на предельное значение.Если файл создан в режиме
'w','x'или'a', а затемclosedбез добавления каких-либо файлов в архив, в файл будут записаны соответствующие ZIP-структуры для пустого архива.ZipFile также является менеджером контекста и поэтому поддерживает оператор
with. В примере myzip закрывается после завершения набора операторовwith- даже если возникает исключение:with ZipFile('spam.zip', 'w') as myzip: myzip.write('eggs.txt')
Добавлено в версии 3.2: Добавлена возможность использовать
ZipFileв качестве менеджера контекста.Изменено в версии 3.4: Расширения ZIP64 включены по умолчанию.
Изменено в версии 3.5: Добавлена поддержка записи в непросматриваемые потоки. Добавлена поддержка режима
'x'.Изменено в версии 3.6: Ранее для нераспознанных значений сжатия выдавалось обычное сообщение
RuntimeError.Изменено в версии 3.6.2: Параметр file принимает значение path-like object.
Изменено в версии 3.7: Добавьте параметр compresslevel.
Добавлено в версии 3.8: Аргумент strict_timestamps только для ключевого слова
-
ZipFile.close()¶ Закрыть архивный файл. Вы должны вызвать
close()перед выходом из программы, иначе основные записи не будут записаны.
-
ZipFile.getinfo(name)¶ Возвращает объект
ZipInfoс информацией о члене архива name. Вызовgetinfo()для имени, которое в данный момент не содержится в архиве, вызовет ошибкуKeyError.
-
ZipFile.infolist()¶ Возвращает список, содержащий объект
ZipInfoдля каждого члена архива. Объекты располагаются в том же порядке, что и их записи в реальном ZIP-файле на диске, если был открыт существующий архив.
-
ZipFile.namelist()¶ Возвращает список членов архива по имени.
-
ZipFile.open(name, mode='r', pwd=None, *, force_zip64=False)¶ Доступ к члену архива как к двоичному файлоподобному объекту. name может быть либо именем файла в архиве, либо объектом
ZipInfo. Параметр mode, если он включен, должен быть'r'(по умолчанию) или'w'. pwd - это пароль, используемый для расшифровки зашифрованных ZIP-файлов.open()также является менеджером контекста и поэтому поддерживает операторwith:with ZipFile('spam.zip') as myzip: with myzip.open('eggs.txt') as myfile: print(myfile.read())
При mode
'r'файлоподобный объект (ZipExtFile) доступен только для чтения и предоставляет следующие методы:read(),readline(),readlines(),seek(),tell(),__iter__(),__next__(). Эти объекты могут работать независимо от ZipFile.При использовании
mode='w'возвращается дескриптор файла, доступного для записи, который поддерживает методwrite(). Пока открыт дескриптор файла, доступного для записи, попытка чтения или записи других файлов в ZIP-файле вызовет ошибкуValueError.При записи файла, если размер файла заранее не известен, но может превысить 2 Гигабайта, передайте
force_zip64=True, чтобы убедиться, что формат заголовка способен поддерживать большие файлы. Если размер файла известен заранее, создайте объектZipInfoс установленнымfile_sizeи используйте его в качестве параметра name.Примечание
Методы
open(),read()иextract()могут принимать имя файла или объектZipInfo. Вы оцените это при попытке прочитать ZIP-файл, содержащий члены с дублирующимися именами.Изменено в версии 3.6: Удалена поддержка
mode='U'. Используйтеio.TextIOWrapperдля чтения сжатых текстовых файлов в режиме universal newlines.Изменено в версии 3.6:
ZipFile.open()теперь можно использовать для записи файлов в архив с опциейmode='w'.Изменено в версии 3.6: Вызов
open()на закрытом ZipFile приведет к появлениюValueError. Ранее вызывалась ошибкаRuntimeError.
-
ZipFile.extract(member, path=None, pwd=None)¶ Извлечь член из архива в текущий рабочий каталог; member должно быть его полным именем или объектом
ZipInfo. Его файловая информация извлекается как можно точнее. path указывает другой каталог для извлечения. член может быть именем файла или объектомZipInfo. pwd - это пароль, используемый для зашифрованных файлов.Возвращает созданный нормализованный путь (каталог или новый файл).
Примечание
Если имя файла-члена является абсолютным путем, диск/UNC sharepoint и ведущие (обратные) косые черты будут удалены, например:
///foo/barстановитсяfoo/barна Unix, аC:\foo\barстановитсяfoo\barна Windows. И все компоненты".."в имени файла-члена будут удалены, например, :../../foo../../ba..rbecomesfoo../ba..r. On Windows illegal characters (:,<,>,|,",?, and*) replaced by underscore (_).Изменено в версии 3.6: Вызов
extract()на закрытом ZipFile приведет к появлениюValueError. Ранее вызывалась ошибкаRuntimeError.Изменено в версии 3.6.2: Параметр path принимает значение path-like object.
-
ZipFile.extractall(path=None, members=None, pwd=None)¶ Извлечь все члены из архива в текущий рабочий каталог. path указывает другой каталог для извлечения. members необязателен и должен быть подмножеством списка, возвращаемого командой
namelist(). pwd - пароль, используемый для зашифрованных файлов.Предупреждение
Никогда не извлекайте архивы из ненадежных источников без предварительной проверки. Возможно, что файлы создаются вне path, например, члены, имеющие абсолютные имена, начинающиеся с
"/"или имена с двумя точками"..". Данный модуль пытается предотвратить это. См. примечаниеextract().Изменено в версии 3.6: Вызов
extractall()на закрытом ZipFile приведет к появлениюValueError. Ранее вызывалась ошибкаRuntimeError.Изменено в версии 3.6.2: Параметр path принимает значение path-like object.
-
ZipFile.printdir()¶ Выведите оглавление для архива в
sys.stdout.
-
ZipFile.setpassword(pwd)¶ Установите pwd в качестве пароля по умолчанию для извлечения зашифрованных файлов.
-
ZipFile.read(name, pwd=None)¶ Возвращает байты файла name в архиве. name - это имя файла в архиве или объект
ZipInfo. Архив должен быть открыт для чтения или добавления. pwd - это пароль, используемый для зашифрованных файлов, и если он указан, то отменяет пароль по умолчанию, установленный с помощьюsetpassword(). Вызовread()на ZipFile, который использует метод сжатия, отличный отZIP_STORED,ZIP_DEFLATED,ZIP_BZIP2илиZIP_LZMAвызовет ошибкуNotImplementedError. Также будет выдана ошибка, если соответствующий модуль сжатия недоступен.Изменено в версии 3.6: Вызов
read()на закрытом ZipFile приведет к появлениюValueError. Ранее вызывалась ошибкаRuntimeError.
-
ZipFile.testzip()¶ Прочитать все файлы в архиве и проверить их CRC и заголовки файлов. Верните имя первого плохого файла, иначе верните
None.Изменено в версии 3.6: Вызов
testzip()на закрытом ZipFile приведет к появлениюValueError. Ранее вызывалась ошибкаRuntimeError.
-
ZipFile.write(filename, arcname=None, compress_type=None, compresslevel=None)¶ Записывает файл с именем filename в архив, присваивая ему имя архива arcname (по умолчанию это будет то же самое, что и filename, но без буквы диска и с удаленными ведущими разделителями путей). Если задано, compress_type переопределяет значение параметра compression в конструкторе новой записи. Аналогично, compresslevel переопределяет конструктор, если задан. Архив должен быть открыт в режиме
'w','x'или'a'.Примечание
Имена архивов должны быть относительными к корню архива, то есть они не должны начинаться с разделителя путей.
Примечание
Если
arcname(илиfilename, еслиarcnameне указан) содержит нулевой байт, имя файла в архиве будет усечено на нулевом байте.Примечание
Косая черта в имени файла может привести к тому, что архив невозможно будет открыть в некоторых программах zip на системах Windows.
Изменено в версии 3.6: Вызов
write()на ZipFile, созданном с режимом'r'или закрытом ZipFile вызовет ошибкуValueError. Ранее вызывалась ошибкаRuntimeError.
-
ZipFile.writestr(zinfo_or_arcname, data, compress_type=None, compresslevel=None)¶ Записать файл в архив. Содержимым является data, которая может быть либо экземпляром
str, либоbytes; если этоstr, то сначала она кодируется как UTF-8. zinfo_or_arcname - это либо имя файла, которое будет дано в архиве, либо экземплярZipInfo. Если это экземпляр, то должны быть указаны как минимум имя файла, дата и время. Если это имя, то дата и время устанавливаются на текущую дату и время. Архив должен быть открыт в режиме'w','x'или'a'.Если задано, compress_type переопределяет значение, заданное для параметра compression в конструкторе новой записи или в zinfo_or_arcname (если это экземпляр
ZipInfo). Аналогично, compresslevel будет переопределять конструктор, если он задан.Примечание
При передаче экземпляра
ZipInfoв качестве параметра zinfo_or_arcname используется метод сжатия, указанный в члене compress_type данного экземпляраZipInfo. По умолчанию конструкторZipInfoустанавливает этот член в значениеZIP_STORED.Изменено в версии 3.2: Аргумент compress_type.
Изменено в версии 3.6: Вызов
writestr()на ZipFile, созданном с режимом'r'или закрытом ZipFile вызовет ошибкуValueError. Ранее вызывалась ошибкаRuntimeError.
Также доступны следующие атрибуты данных:
-
ZipFile.filename¶ Имя файла ZIP.
-
ZipFile.debug¶ Уровень отладочного вывода, который будет использоваться. Он может быть установлен в диапазоне от
0(по умолчанию, без вывода) до3(максимальный вывод). Отладочная информация записывается вsys.stdout.
Объекты пути¶
-
class
zipfile.Path(root, at='')¶ Создайте объект Path из zip-файла
root(который может быть экземпляромZipFileилиfile, подходящим для передачи конструкторуZipFile).atуказывает расположение этого Пути в zip-файле, например, „dir/file.txt“, „dir/“, или „“. По умолчанию это пустая строка, указывающая на корень.
Объекты Path раскрывают следующие возможности объектов pathlib.Path:
Объекты пути можно обходить с помощью оператора / или joinpath.
-
Path.name¶ Последний компонент пути.
-
Path.open(mode='r', *, pwd, **)¶ Вызвать команду
ZipFile.open()по текущему пути. Позволяет открывать путь для чтения или записи, текстовый или двоичный через поддерживаемые режимы: „r“, „w“, „rb“, „wb“. Позиционные и ключевые аргументы передаются вio.TextIOWrapperпри открытии как текст и игнорируются в противном случае.pwdявляется параметромpwdдляZipFile.open().Изменено в версии 3.9: Добавлена поддержка текстового и двоичного режимов для open. Режим по умолчанию теперь текстовый.
-
Path.iterdir()¶ Перечислить дочерние элементы текущего каталога.
-
Path.is_dir()¶ Возвращает
True, если текущий контекст ссылается на каталог.
-
Path.is_file()¶ Возвращает
True, если текущий контекст ссылается на файл.
-
Path.exists()¶ Возвращает
True, если текущий контекст ссылается на файл или каталог в zip-файле.
-
Path.read_text(*, **)¶ Считывание текущего файла как юникодового текста. Позиционные и ключевые аргументы передаются через
io.TextIOWrapper(кромеbuffer, который подразумевается контекстом).
-
Path.read_bytes()¶ Считывание текущего файла в виде байтов.
-
Path.joinpath(*other)¶ Возвращает новый объект Path с каждым из других аргументов. Следующие аргументы эквивалентны:
>>> Path(...).joinpath('child').joinpath('grandchild') >>> Path(...).joinpath('child', 'grandchild') >>> Path(...) / 'child' / 'grandchild'
Изменено в версии 3.10: До версии 3.10 функция
joinpathбыла недокументированной и принимала ровно один параметр.
Объекты PyZipFile¶
Конструктор PyZipFile принимает те же параметры, что и конструктор ZipFile, и один дополнительный параметр, optimize.
-
class
zipfile.PyZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, optimize=- 1)¶ Добавлено в версии 3.2: Параметр оптимизировать.
Изменено в версии 3.4: Расширения ZIP64 включены по умолчанию.
Экземпляры имеют один метод в дополнение к методам объектов
ZipFile:-
writepy(pathname, basename='', filterfunc=None)¶ Поиск файлов
*.pyи добавление соответствующего файла в архив.Если параметр optimize в
PyZipFileне был задан или-1, то соответствующий файл является файлом*.pyc, компилируемым при необходимости.Если параметр optimize в
PyZipFileбыл0,1или2, то в архив добавляются только файлы с этим уровнем оптимизации (см.compile()), при необходимости компилируются.Если pathname является файлом, имя файла должно заканчиваться на
.py, и на верхнем уровне добавляется только (соответствующий*.pyc) файл (без информации о пути). Если pathname является файлом, имя которого не заканчивается на.py, будет выдано предупреждениеRuntimeError. Если это каталог, и каталог не является каталогом пакета, то все файлы*.pycдобавляются на верхнем уровне. Если каталог является каталогом пакета, то все*.pycдобавляются под именем пакета в виде пути к файлу, а если какие-либо подкаталоги являются каталогами пакета, то все они добавляются рекурсивно в отсортированном порядке.basename предназначен только для внутреннего использования.
filterfunc, если задан, должен быть функцией, принимающей один строковый аргумент. Ей будет передан каждый путь (включая каждый отдельный полный путь к файлу) перед его добавлением в архив. Если filterfunc возвращает значение false, то путь не будет добавлен, а если это каталог, то его содержимое будет проигнорировано. Например, если все наши тестовые файлы находятся в каталогах
testили начинаются со строкиtest_, мы можем использовать filterfunc для их исключения:>>> zf = PyZipFile('myprog.zip') >>> def notests(s): ... fn = os.path.basename(s) ... return (not (fn == 'test' or fn.startswith('test_'))) >>> zf.writepy('myprog', filterfunc=notests)
Метод
writepy()создает архивы с такими именами файлов:string.pyc # Top level name test/__init__.pyc # Package directory test/testall.pyc # Module test.testall test/bogus/__init__.pyc # Subpackage directory test/bogus/myfile.pyc # Submodule test.bogus.myfile
Добавлено в версии 3.4: Параметр filterfunc.
Изменено в версии 3.6.2: Параметр pathname принимает значение path-like object.
Изменено в версии 3.7: Рекурсия сортирует записи каталога.
-
Объекты ZipInfo¶
Экземпляры класса ZipInfo возвращаются методами getinfo() и infolist() объектов ZipFile. Каждый объект хранит информацию об одном члене архива ZIP.
Существует один метод класса для создания экземпляра ZipInfo для файла файловой системы:
-
classmethod
ZipInfo.from_file(filename, arcname=None, *, strict_timestamps=True)¶ Создайте экземпляр
ZipInfoдля файла в файловой системе, чтобы подготовить его к добавлению в zip-файл.filename должно быть путем к файлу или каталогу в файловой системе.
Если указано arcname, оно используется в качестве имени внутри архива. Если arcname не указано, имя будет таким же, как filename, но с удаленными буквами дисков и ведущими разделителями путей.
Аргумент strict_timestamps, когда он установлен в
False, позволяет застегивать файлы старше 1980-01-01 ценой установки временной метки на 1980-01-01. Аналогичное поведение происходит с файлами новее 2107-12-31, временная метка также устанавливается на предельное значение.Добавлено в версии 3.6.
Изменено в версии 3.6.2: Параметр filename принимает значение path-like object.
Добавлено в версии 3.8: Аргумент strict_timestamps только для ключевого слова
Экземпляры имеют следующие методы и атрибуты:
-
ZipInfo.is_dir()¶ Возвращает
True, если данный член архива является каталогом.При этом используется имя записи: каталоги всегда должны заканчиваться на
/.Добавлено в версии 3.6.
-
ZipInfo.filename¶ Имя файла в архиве.
-
ZipInfo.date_time¶ Время и дата последней модификации члена архива. Это кортеж из шести значений:
Индекс
Значение
0Год (>= 1980)
1Месяц (на основе одного)
2День месяца (на основе одного)
3Часы (на нулевой основе)
4Минуты (на основе нуля)
5Секунды (на основе нуля)
Примечание
Формат файлов ZIP не поддерживает временные метки до 1980 года.
-
ZipInfo.compress_type¶ Тип сжатия для члена архива.
-
ZipInfo.extra¶ Данные поля расширения. PKZIP Application Note содержит некоторые комментарии по внутренней структуре данных, содержащихся в этом объекте
bytes.
-
ZipInfo.create_system¶ Система, создавшая ZIP-архив.
-
ZipInfo.create_version¶ Версия PKZIP, создающая ZIP-архив.
-
ZipInfo.extract_version¶ Версия PKZIP, необходимая для извлечения архива.
-
ZipInfo.reserved¶ Должно быть равно нулю.
-
ZipInfo.flag_bits¶ Биты флага ZIP.
-
ZipInfo.volume¶ Номер тома заголовка файла.
-
ZipInfo.internal_attr¶ Внутренние атрибуты.
-
ZipInfo.external_attr¶ Атрибуты внешних файлов.
-
ZipInfo.header_offset¶ Смещение байта до заголовка файла.
-
ZipInfo.CRC¶ CRC-32 несжатого файла.
-
ZipInfo.compress_size¶ Размер сжатых данных.
-
ZipInfo.file_size¶ Размер несжатого файла.
Интерфейс командной строки¶
Модуль zipfile предоставляет простой интерфейс командной строки для взаимодействия с архивами ZIP.
Если вы хотите создать новый ZIP-архив, укажите его имя после опции -c, а затем перечислите имена файлов, которые должны быть включены:
$ python -m zipfile -c monty.zip spam.txt eggs.txt
Передача каталога также допустима:
$ python -m zipfile -c monty.zip life-of-brian_1979/
Если вы хотите распаковать ZIP-архив в указанный каталог, используйте опцию -e:
$ python -m zipfile -e monty.zip target-dir/
Для получения списка файлов в ZIP-архиве используйте опцию -l:
$ python -m zipfile -l monty.zip
Параметры командной строки¶
Подводные камни декомпрессии¶
Извлечение в модуле zipfile может закончиться неудачей из-за некоторых подводных камней, перечисленных ниже.
Из самого файла¶
Распаковка может завершиться неудачей из-за неправильного пароля / контрольной суммы CRC / формата ZIP или неподдерживаемого метода сжатия / расшифровки.
Ограничения файловой системы¶
Превышение ограничений различных файловых систем может привести к сбою распаковки. Например, допустимые символы в записях каталога, длина имени файла, длина имени пути, размер одного файла, количество файлов и т.д.
Ограничения ресурсов¶
Нехватка памяти или объема диска приведет к неудачной декомпрессии. Например, бомбы декомпрессии (они же ZIP bomb) применяются к библиотеке zipfile, что может привести к исчерпанию дискового объема.
Прерывание¶
Прерывание во время распаковки, например, нажатие клавиши control-C или завершение процесса распаковки может привести к неполной распаковке архива.
Поведение извлечения по умолчанию¶
Незнание стандартного поведения при извлечении может привести к неожиданным результатам распаковки. Например, при извлечении одного и того же архива дважды он перезаписывает файлы без запроса.