我正在尝试将文件从一个目录移动到另一个目录。问题在于,当文件位于新目录中时,它们将保留以前的权限,而不是为该文件夹设置的新权限。
我正在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权限。
答案 0 :(得分:1)
您的观察
当前移动的文件在创建时保留了自己的ACL权限,这与预期的不一样。
似乎是预期的行为。遵循Microsoft支持文章How permissions are handled when you copy and move files and folders。
默认情况下,对象在创建时,复制或移动到其父文件夹时都会从其父对象继承权限。当您将对象移动到同一卷上的另一个文件夹时,将发生此规则的唯一例外。在这种情况下,原始权限将保留。
答案 1 :(得分:0)
第一个问题是:您要使其在Unix / Windows上可移植吗?
因为每个操作系统都有特定的文件属性。
对于便携式解决方案(大多数操作系统共有的属性):
从要移动到的目标文件夹中获取 BasicFileAttributes 。例如:
BasicFileAttributes basicAttr = Files.readAttributes(file,BasicFileAttributes.class);
为每个移动文件设置属性
对于特定于操作系统的解决方案,可以使用:
代替BasicFileAttributes。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)