Я использую функцию Files.move для перемещения файла, но она не наследует разрешения родительской папки - PullRequest
0 голосов
/ 18 января 2019

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

Я пытаюсь это сделать в своем приложении Java 8 длялокальная машина / клиент.Я попытался найти ответ, но все, что я нашел, это примеры Linux и C #.

Я попытался изменить настройки изменения разрешений ACL в OS / Server, но Windows уже правильно обрабатывает замену разрешений ACL, это простоКод Java, который игнорирует это.

Я действительно хочу использовать метод перемещения, а не методы копирования + удаления.

Это единственная строка кода, которую я использую:

Files.move(pdfFile.toPath(), Paths.get(newFileWithoutExtension + ".pdf"), StandardCopyOption.REPLACE_EXISTING);

Я ожидаю, что файл, который я перемещаю в новый каталог, унаследует разрешения ACL, установленные для этого каталога.

В настоящее время перемещенные файлы сохраняют свои собственные разрешения ACLоткуда они были созданы, что не соответствует ожидаемому.

Редактировать 1: Изменены разрешения на разрешения ACL.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Ваше наблюдение

В настоящее время перемещенные файлы сохраняют свои собственные разрешения ACL от того места, где они были созданы, что не соответствует ожиданиям.

Кажется, ожидаемое поведение. После статьи службы поддержки Microsoft Как обрабатываются разрешения при копировании и перемещении файлов и папок .

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

0 голосов
/ 18 января 2019

Первый вопрос: хотите ли вы сделать его переносимым через Unix / Windows?

Поскольку каждая ОС имеет определенные атрибуты файлов.


Для решения Portable(атрибуты, общие для большинства операционных систем):

  1. Получить BasicFileAttributes из папки назначения, в которую вы перемещаетесь.например:

    BasicFileAttributes basicAttr = Files.readAttributes (file, BasicFileAttributes.class);

  2. Установить атрибуты для каждого перемещенного файла

Для конкретного решения ОС вместо BasicFileAttributes можно использовать:

  • DosFileAttributes для Windows:

    DosFileAttributes attrs = Files.readAttributes (file, DosFileAttributes.class);

    // Для получения значений атрибутов
    логическое значение isArchive = attrs.isArchive ()
    логическое значение isHidden = attrs.isHidden ()
    логическое значение isReadOnly = attrs.isReadOnly ()
    boolean isSystem = attrs.isSystem ()

    // Для установки атрибутов в новый файл
    Files.setAttribute (newFile, "dos: archive", isArchive);
    Files.setAttribute (newFile, "dos: hidden", isHidden);
    Files.setAttribute (newFile, "dos: readonly", isReadOnly);
    Files.setAttribute (newFile, "dos: system)", isSystem);


- PosixFileAttributes для Unix

...