我正在使用Files.move函数移动文件,但它不会继承父文件夹权限

时间:2019-01-18 13:56:23

标签: java file permissions system

我正在尝试将文件从一个目录移动到另一个目录。问题在于,当文件位于新目录中时,它们将保留以前的权限,而不是为该文件夹设置的新权限。

我正在Java 8应用程序中尝试在本地计算机/客户端上执行此操作。我曾尝试寻找答案,但发现的只是Linux和C#示例。

我曾尝试在OS / Server中更改ACL权限更改设置,但Windows已正确处理了ACL权限交换,只是Java代码忽略了此操作。

我真的很想使用move方法,而不是copy + delete方法。

这是我正在使用的唯一代码行:

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

我希望移至新目录的文件将继承为该目录设置的ACL权限。

当前移动的文件在创建时保留了自己的ACL权限,这与预期的不一样。

编辑1:将权限更改为ACL权限。

2 个答案:

答案 0 :(得分:1)

您的观察

  

当前移动的文件在创建时保留了自己的ACL权限,这与预期的不一样。

似乎是预期的行为。遵循Microsoft支持文章How permissions are handled when you copy and move files and folders

  

默认情况下,对象在创建时,复制或移动到其父文件夹时都会从其父对象继承权限。当您将对象移动到同一卷上的另一个文件夹时,将发生此规则的唯一例外。在这种情况下,原始权限将保留

答案 1 :(得分:0)

第一个问题是:您要使其在Unix / Windows上可移植吗?

因为每个操作系统都有特定的文件属性。


对于便携式解决方案(大多数操作系统共有的属性):

  1. 从要移动到的目标文件夹中获取 BasicFileAttributes 。例如:

      

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

  2. 为每个移动文件设置属性

对于特定于操作系统的解决方案,可以使用:

代替BasicFileAttributes。
    Windows的
  • DosFileAttributes
      

    DosFileAttributes属性= Files.readAttributes(file,DosFileAttributes.class);   

    //要获取属性值
      布尔值isArchive = attrs.isArchive()
      布尔值isHidden = attrs.isHidden()
      boolean isReadOnly = attrs.isReadOnly()
      布尔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)