Сохранение прав доступа к файлу при извлечении из zip-файла с использованием API JDK 5 - PullRequest
18 голосов
/ 26 июня 2009

Я использую java.util.Zip и java.util.ZipEntry для успешного извлечения содержимого файла zip на диск. Я хотел бы сохранить права доступа к файлу, установленные при извлечении в файловой системе * nix.

Может кто-нибудь указать мне на "правильный" способ сделать это?

Ответы [ 4 ]

10 голосов
/ 12 марта 2010

Я думаю, что на самом деле невозможно правильно сохранить разрешения.

Разрешения зависят от конкретной ОС: в то время как права доступа к файлу POSIX позволяют пользователю устанавливать, можете ли вы читать, записывать или выполнять файл для владельца файла, группы и других, файловая система NTFS имеет аналогичную систему, но концепция для разрешение на исполнение не существует. И ранняя файловая система FAT / FAT32 вообще не имеет прав доступа к файлам (часть атрибута только для чтения).

Будучи кроссплатформенным, для Java было бы трудно правильно установить разрешение для вновь создаваемых (разархивированных) файлов в зависимости от базовой ОС ....

Тем не менее, в Java 6 появился новый класс java.io.File , который позволяет вам устанавливать разрешения (с помощью таких методов, как setExecutable (), setReadable () и т. Д.)

Это мне очень помогло, особенно setExecutable (), который был моей главной заботой при необходимости разархивировать исполняемые файлы в файловой системе Linux. И вам не нужно беспокоиться о том, какую операционную систему вы используете, так как метод просто ничего не сделает, если работает под Windows или другими системами без концепции исполняемых файлов.

1 голос
/ 15 декабря 2016

По сути, вы не можете СОХРАНИТЬ (unix) права доступа к файлам в файлах Zip / Jar, поэтому вы не можете сохранить их при извлечении вашего jar (они были потеряны, когда jar был создан с самого начала). См. Этот вопрос: создание файла JAR - сохранение прав доступа к файлу

Если вам нужны права доступа к файлам, сохраненные в архиве и восстановленные при извлечении, вы должны рассмотреть альтернативный формат .tar или .tar.gz / .tar.bz2, который также изначально поддерживается большинством инструментов сборки Java (Ant , Gradle, Maven ...)

1 голос
/ 26 июня 2009

Посмотрите на Apache Commons Compress и посмотрите на TarArchiveEntry, который должен сохранить права доступа к файлам так, как вы этого хотите.

TarArchiveEntry entry = tarInput.getNextTarEntry();

Вот javadocs . Я думаю, что я сошел с ума.

0 голосов
/ 22 февраля 2019

Как отслеживается в этой ошибке OpenJDK: https://bugs.openjdk.java.net/browse/JDK-6194856:

«Стандартный» формат файла zip не имеет никакого способа сохранить метаинформация «исполняемый файл», поскольку изначально для файловых систем MS-DOS.

Для сохранения информации Unix, такой как режимы файлов, zip обработка кода должна обрабатывать расширения в формате zip-файла. Другие реализации zip имеют такие расширения.

Существуют некоторые расширения формата файла, которые позволят сохранить такого рода информация, но она никогда не может быть гарантирована (нет требование, чтобы zip-файлы содержали такие «расширенные» метаданные) и было бы много работы для реализации и (особенно!) тестирования.

Также смотрите этот ответ: Могу ли я хранить разрешения Unix в zip-файле (созданном с помощью Apache Ant)?

Нестандартные библиотеки Java могут реализовывать это (например, apache-commons).

...