【问题标题】:I am using the Files.move function to move a file, but it does not inherit the parent folder permissions我正在使用 Files.move 函数移动文件,但它不继承父文件夹权限
【发布时间】:2026-02-07 06:30:02
【问题描述】:

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

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

我已尝试更改操作系统/服务器中的 ACL 权限更改设置,但 Windows 已正确处理 ACL 权限交换,只是 Java 代码忽略了这一点。

我真的想使用移动方法,而不是复制+删除方法。

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

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

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

当前移动的文件从创建它们的位置保留自己的 ACL 权限,这与预期不同。

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

【问题讨论】:

  • 你的意思是什么权限? DOS 权限(可以设置例如attrib)或ACL 权限(可以设置例如icacls)?
  • @SubOptimal 我的意思是 ACL 权限,对不起,我不知道他们被称为那个。我将编辑我的原始问题以包含此内容。

标签: java file permissions system


【解决方案1】:

你的观察

当前移动的文件从创建它们的位置保留自己的 ACL 权限,这与预期不同。

似乎是预期的行为。关注微软支持文章How permissions are handled when you copy and move files and folders

默认情况下,对象从其父对象继承权限,无论是在创建时,还是在复制或移动到其父文件夹时。当您将对象移动到同一卷上的不同文件夹时,会出现此规则的唯一例外情况。在这种情况下,保留原有权限

【讨论】:

    【解决方案2】:

    第一个问题是:你想让它跨 Unix/Windows 移植吗?

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


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

    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()
      boolean 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

    【讨论】:

    • 感谢您的回复,但是我从哪里获得使用此权限的权限?我检查了 JDocs 但我没有找到任何可以做到这一点的方法?大多数方法只返回一个布尔值。
    • BasicFileAttributes basAtr = Files.readAttributes(file,BasicFileAttributes.class);
    • 当我这样做时,我确实得到了一个这种类型的对象,但是我能用它做什么呢?我没有看到可以调用的方法来查看为此文件设置了哪些权限,或者没有将所有属性从一个文件复制到另一个文件的方法?很抱歉忘记了操作系统问题,它仅限于 Windows。
    • 啊,是的,但是我确实看到了,但这是否涵盖了哪个用户具有哪些权限?在我看来不像?也许我误解了我的意思是哪种权限,但我们对不同的用户和组有不同的权限。
    • Windows 中每个组和用户的权限?那不存在。
    最近更新 更多