使用JAVA更改目录中所有文件的权限

问题描述

我想编写一段代码,以便将目录中的所有文件设置为可写(非只读)。 我的程序在JAVA中,它在Windows和Linux上都可以工作。到目前为止,我的方法是遍历目录中包含的所有文件,并使用以下方法为每个文件将权限设置为可写:

  static void makeDosFileWritable(Path pathToFile) {
    try {
      Files.setAttribute(pathToFile.toAbsolutePath(),"dos:readonly",false);
       //logs
    } catch (IOException e) {
       //logs
    }
  }


  static void makeUnixFileWritable(Path pathToFile) {
    try {
      Set<PosixFilePermission> ownerWritable = PosixFilePermissions.fromString("rw-rw-rw-");
      Files.setPosixFilePermissions(pathToFile,ownerWritable);
     //logs
    } catch (IOException e) {
     //logs
    }
  }

这很好。问题是,在顶层目录中,我也可能有嵌套目录。我想知道如何处理。

  • 是否应该递归浏览每个(子)目录并更改每个文件的权限?
  • 或者,是否有机会仅在顶层目录级别上以编程方式(JAVA)更改权限,并且该设置自动应用于目录及其子目录中包含的所有文件

解决方法

您可以参考this Github仓库-它具有用于更改Windows,* Nix甚至MacO权限的实现。可以找到相关代码here

代码可能会更旧,但是实现仍然可以正常工作。

,

在Java中,如果您不想产生操作系统实用程序来执行此操作,则需要处理代码中的目录递归。实现一个函数,该函数将代表目录的File作为其参数。使用File.listFiles()展开目录中的文件,然后使用File.isDirectory()测试每个文件是否为目录。如果是目录,请使用新目录递归调用自己。

有很多需要注意的地方-例如,如果目录中出现“ ..”目录,则不想显式展开。您可能需要检查循环链接。您可能需要将扩展​​限制为特定的深度或特定的设备,等等。

它需要大量代码才能以有用且健壮的方式进行此扩展,但是,如果您组织得当,则只需编写一次。

,

这是我能想到的。您可以通过调用Runtime.getRuntime().exec(//The command of your OS that allows user to change folder permission)来使用CLI。这应该是最简单的方法。

此外,如果您熟悉C或C ++并使用Windows,则可以查看JNA库来访问Windows的本机功能。