Как сохранить права доступа к файлам при использовании FileUtils.copyDirectory?

Когда я использую FileUtils.copyDirectory(), биты выполнения отключаются для исполняемых файлов.
Нужно ли включать их вручную?

FWIW, мой umask установлен на 0027, но похоже, что FileUtils.copyDirectory() не использует этот параметр, поскольку «другие» разрешения, кроме бита выполнения, сохраняются.


person Noel Yap    schedule 27.07.2011    source источник
comment
Какую операционную систему ты используешь? Я не удивлюсь, если поведение Linux, FreeBSD и Mac OS X будет отличаться...   -  person gutch    schedule 27.07.2011
comment
Я на Линуксе. Поскольку у меня есть обходной путь, я подожду до принятия Java 7 в моей компании.   -  person Noel Yap    schedule 28.07.2011


Ответы (2)


Будущие дополнения файловой системы в Java 7 помогут. Посмотрите JSR-203. Если вы используете Linux, вы можете использовать бэкпорт с Java 6.

Вам нужен новый API: Files.copy(Path, Path, CopyOptions). Обратите внимание, что CopyOptions имеет COPY_ATTRIBUTES, который будет делать то, что вы хотите.

person Dilum Ranatunga    schedule 27.07.2011
comment
Используя этот API, если вы скопируете непустой каталог, он создаст только пустой каталог в целевом path. Любое обходное решение? - person Emadpres; 03.04.2020
comment
COPY_ATTRIBUTES работает не во всех файловых системах. В macOS выдает UnsupportedOperationException. - person Abhijit Sarkar; 10.01.2021

Я не думаю, что это возможно из-за ограничений JVM. API и поведение ввода-вывода несколько позорны для самого популярного языка/платформы в мире.

Если вы посмотрите на исходный код FileUtils, во время копирования он создает новый файл, подобный этому

File copiedFile = new File(destDir, srcFile.getName()); 

права доступа к файлам не сохраняются. И во время фактического копирования байты копируются партиями (буферизируются) и записываются в новый файл.

но вы можете подождать пару дней или использовать предварительную версию JDK7, в которой есть API, чтобы это стало возможным.

person smartnut007    schedule 27.07.2011