如何以编程方式更改文件权限?

jobtbby3  于 2021-08-20  发布在  Java
关注(0)|答案(12)|浏览(489)

在java中,我正在动态创建一组文件,并希望在linux/unix文件系统上更改这些文件的文件权限。我希望能够执行与 chmod . 这可能是Java5吗?如果是,怎么做?
我知道在Java6中 File 对象具有 setReadable() / setWritable() 方法。我也知道我可以通过系统调用来实现这一点,但如果可能的话,我希望避免这样做。

mkh04yzy

mkh04yzy1#

Java7中提供了对文件属性的完全控制,作为“新”io工具(nio.2)的一部分。例如,posix权限可以通过 setPosixFilePermissions() ,或在创建文件时使用类似 createFile()newByteChannel() .
您可以使用创建一组权限 EnumSet.of() ,但helper方法 PosixFilePermissions.fromString() will使用一种传统的格式,对许多开发人员来说更具可读性。对于接受 FileAttribute ,您可以使用 Package 权限集 PosixFilePermissions.asFileAttribute() .

  1. Set<PosixFilePermission> ownerWritable = PosixFilePermissions.fromString("rw-r--r--");
  2. FileAttribute<?> permissions = PosixFilePermissions.asFileAttribute(ownerWritable);
  3. Files.createFile(path, permissions);

在早期版本的java中,使用自己的本机代码,或 exec -调用命令行实用程序是常见的方法。

6yoyoihd

6yoyoihd2#

除了erickson的建议之外,还有jna,它允许您在不使用jni的情况下调用本机库。它非常容易使用,我已经在几个项目中使用过,并取得了巨大的成功。
唯一需要注意的是,它比jni慢,因此,如果对大量文件执行此操作,可能会给您带来问题。
(编辑以添加示例)
下面是一个完整的jna chmod示例:

  1. import com.sun.jna.Library;
  2. import com.sun.jna.Native;
  3. public class Main {
  4. private static CLibrary libc = (CLibrary) Native.loadLibrary("c", CLibrary.class);
  5. public static void main(String[] args) {
  6. libc.chmod("/path/to/file", 0755);
  7. }
  8. }
  9. interface CLibrary extends Library {
  10. public int chmod(String path, int mode);
  11. }
展开查看全部
guicsvcw

guicsvcw3#

在Java6之前,java级别不支持文件权限更新。您必须实现自己的本机方法或调用 Runtime.exec() 执行操作系统级命令,如chmod。
从Java6开始,您可以使用 File.setReadable()/File.setWritable()/File.setExecutable() 设置文件权限。但是它没有模拟posix文件系统,它允许为不同的用户设置权限。file.set()仅允许为所有者和其他所有人设置权限。
从Java7开始,引入了posix文件权限。您可以像在*nix系统上那样设置文件权限。语法是:

  1. File file = new File("file4.txt");
  2. file.createNewFile();
  3. Set<PosixFilePermission> perms = new HashSet<>();
  4. perms.add(PosixFilePermission.OWNER_READ);
  5. perms.add(PosixFilePermission.OWNER_WRITE);
  6. Files.setPosixFilePermissions(file.toPath(), perms);

此方法只能在posix文件系统上使用,这意味着您无法在windows系统上调用它。
有关文件权限管理的详细信息,建议您阅读本文。

siv3szwd

siv3szwd4#

对于使用nio 2的windows 7:

  1. public static void main(String[] args) throws IOException {
  2. Path file = Paths.get("c:/touch.txt");
  3. AclFileAttributeView aclAttr = Files.getFileAttributeView(file, AclFileAttributeView.class);
  4. System.out.println(aclAttr.getOwner());
  5. for (AclEntry aclEntry : aclAttr.getAcl()) {
  6. System.out.println(aclEntry);
  7. }
  8. System.out.println();
  9. UserPrincipalLookupService upls = file.getFileSystem().getUserPrincipalLookupService();
  10. UserPrincipal user = upls.lookupPrincipalByName(System.getProperty("user.name"));
  11. AclEntry.Builder builder = AclEntry.newBuilder();
  12. builder.setPermissions( EnumSet.of(AclEntryPermission.READ_DATA, AclEntryPermission.EXECUTE,
  13. AclEntryPermission.READ_ACL, AclEntryPermission.READ_ATTRIBUTES, AclEntryPermission.READ_NAMED_ATTRS,
  14. AclEntryPermission.WRITE_ACL, AclEntryPermission.DELETE
  15. ));
  16. builder.setPrincipal(user);
  17. builder.setType(AclEntryType.ALLOW);
  18. aclAttr.setAcl(Collections.singletonList(builder.build()));
  19. }
展开查看全部
00jrzges

00jrzges5#

如果要对创建的文件设置777权限,可以使用以下方法:

  1. public void setPermission(File file) throws IOException{
  2. Set<PosixFilePermission> perms = new HashSet<>();
  3. perms.add(PosixFilePermission.OWNER_READ);
  4. perms.add(PosixFilePermission.OWNER_WRITE);
  5. perms.add(PosixFilePermission.OWNER_EXECUTE);
  6. perms.add(PosixFilePermission.OTHERS_READ);
  7. perms.add(PosixFilePermission.OTHERS_WRITE);
  8. perms.add(PosixFilePermission.OTHERS_EXECUTE);
  9. perms.add(PosixFilePermission.GROUP_READ);
  10. perms.add(PosixFilePermission.GROUP_WRITE);
  11. perms.add(PosixFilePermission.GROUP_EXECUTE);
  12. Files.setPosixFilePermissions(file.toPath(), perms);
  13. }
展开查看全部
8iwquhpp

8iwquhpp6#

只是为了更新这个答案,除非以后有人遇到这个问题,因为您可以使用jdk 6

  1. File file = new File('/directory/to/file');
  2. file.setWritable(boolean);
  3. file.setReadable(boolean);
  4. file.setExecutable(boolean);

您可以在oracle文件(java平台SE7)上找到文档。请记住,只有当前工作用户拥有该文件的所有权或写入权限时,这些命令才起作用。我知道op需要chmod类型的访问来进行更复杂的用户配置。这些将为所有用户设置全面的选项。

lkaoscv7

lkaoscv77#

您可以使用file类的方法:http://docs.oracle.com/javase/7/docs/api/java/io/file.html

nukf8bse

nukf8bse8#

对于oralce java 6:

  1. private static int chmod(String filename, int mode) {
  2. try {
  3. Class<?> fspClass = Class.forName("java.util.prefs.FileSystemPreferences");
  4. Method chmodMethod = fspClass.getDeclaredMethod("chmod", String.class, Integer.TYPE);
  5. chmodMethod.setAccessible(true);
  6. return (Integer)chmodMethod.invoke(null, filename, mode);
  7. } catch (Throwable ex) {
  8. return -1;
  9. }
  10. }

在solaris/linux下工作。

ngynwnxp

ngynwnxp9#

ApacheAnt chmod(不是很优雅,添加它是为了完整性)与@msorsky共享

  1. Chmod chmod = new Chmod();
  2. chmod.setProject(new Project());
  3. FileSet mySet = new FileSet();
  4. mySet.setDir(new File("/my/path"));
  5. mySet.setIncludes("**");
  6. chmod.addFileset(mySet);
  7. chmod.setPerm("+w");
  8. chmod.setType(new FileDirBoth());
  9. chmod.execute();
6yt4nkrj

6yt4nkrj10#

oracle文档上有一个示例类,其工作原理与unix chmod非常相似。不过,它可以与JavaSE7+一起使用。

bpsygsoo

bpsygsoo11#

  1. simple java code for change file permission in java
  2. String path="D:\\file\\read.txt";
  3. File file=new File(path);
  4. if (file.exists()) {
  5. System.out.println("read="+file.canRead());
  6. System.out.println("write="+file.canWrite());
  7. System.out.println("Execute="+file.canExecute());
  8. file.setReadOnly();
  9. }

参考:如何在java中更改文件权限

bbmckpt7

bbmckpt712#

  1. import java.io.File;
  2. import java.io.IOException;
  3. import java.nio.file.Files;
  4. import java.nio.file.Path;
  5. import java.nio.file.Paths;
  6. import java.nio.file.attribute.FileAttribute;
  7. import java.nio.file.attribute.PosixFileAttributes;
  8. import java.nio.file.attribute.PosixFilePermission;
  9. import java.nio.file.attribute.PosixFilePermissions;
  10. import java.util.Set;
  11. public class FileAndDirectory1 {
  12. public static void main(String[] args) {
  13. File file = new File("fileTest1.txt");
  14. System.out.println(file.getAbsoluteFile());
  15. try {
  16. //file.createNewFile();
  17. if(!file.exists())
  18. {
  19. //PosixFilePermission is an enum class, PosixFilePermissions is a final class
  20. //create file permissions from string
  21. Set<PosixFilePermission> filePermissions = PosixFilePermissions.fromString("---------"/* "rwxrwxrwx" */);
  22. FileAttribute<?> permissions = PosixFilePermissions.asFileAttribute(filePermissions);
  23. Files.createFile(file.toPath(), permissions);
  24. // printing the permissions associated with the file
  25. System.out.println("Executable: " + file.canExecute());
  26. System.out.println("Readable: " + file.canRead());
  27. System.out.println("Writable: "+ file.canWrite());
  28. file.setExecutable(true);
  29. file.setReadable(true);
  30. file.setWritable(true);
  31. }
  32. else
  33. {
  34. //modify permissions
  35. //get the permission using file attributes
  36. Set<PosixFilePermission> perms = Files.readAttributes(file.toPath(), PosixFileAttributes.class).permissions();
  37. perms.remove(PosixFilePermission.OWNER_WRITE);
  38. perms.add(PosixFilePermission.OWNER_READ);
  39. perms.add(PosixFilePermission.OWNER_EXECUTE);
  40. perms.add(PosixFilePermission.GROUP_WRITE);
  41. perms.add(PosixFilePermission.GROUP_READ);
  42. perms.add(PosixFilePermission.GROUP_EXECUTE);
  43. perms.add(PosixFilePermission.OTHERS_WRITE);
  44. perms.add(PosixFilePermission.OTHERS_READ);
  45. perms.add(PosixFilePermission.OTHERS_EXECUTE);
  46. Files.setPosixFilePermissions(file.toPath(), perms);
  47. System.out.println("Executable: " + file.canExecute());
  48. System.out.println("Readable: " + file.canRead());
  49. System.out.println("Writable: "+ file.canWrite());
  50. file.delete();
  51. }
  52. } catch (IOException e) {
  53. e.printStackTrace();
  54. }
  55. Path path = Paths.get(String.valueOf(file));
  56. System.out.println(path);
  57. }
  58. }
展开查看全部

相关问题