4

我知道可以使用以下方法更改文件的权限模式:

Runtime.getRuntime().exec( "chmod 777 myfile" );.

此示例将权限位设置为777777是否可以使用 Java以编程方式设置权限位?可以对每个文件都这样做吗?

4

4 回答 4

9

Using chmod in Android

Java doesn't have native support for platform dependent operations like chmod. However, Android provides utilities for some of these operations via android.os.FileUtils. The FileUtils class is not part of the public SDK and is therefore not supported. So, use this at your own risk:

public int chmod(File path, int mode) throws Exception {
 Class fileUtils = Class.forName("android.os.FileUtils");
Method setPermissions =
  fileUtils.getMethod("setPermissions", String.class, int.class, int.class, int.class);
return (Integer) setPermissions.invoke(null, path.getAbsolutePath(), mode, -1, -1);
}

...
chmod("/foo/bar/baz", 0755);
...

Reference : http://www.damonkohler.com/2010/05/using-chmod-in-android.html?showComment=1341900716400#c4186506545056003185

于 2012-07-10T07:16:43.977 回答
1

Android 使与其他应用程序及其数据的交互变得困难,除非通过 Intents。Intent 不适用于权限,因为您依赖于接收 Intent 的应用程序来执行/提供您想要的;他们可能不是为了告诉任何人他们的文件权限而设计的。有一些方法可以解决它,但只有当应用程序被设计为在同一个 JVM 中运行时。所以每个应用程序只能更改它的文件。有关文件权限的更多详细信息,请参阅http://docs.oracle.com/javase/1.4.2/docs/guide/security/permissions.html

于 2012-07-10T07:11:15.273 回答
1

如前所述,android.os.FileUtils已更改,Ashraf 发布的解决方案不再有效。以下方法应该适用于所有版本的 Android(尽管它确实使用反射,并且如果制造商进行了重大更改,这可能不起作用)。

public static void chmod(String path, int mode) throws Exception {
    Class<?> libcore = Class.forName("libcore.io.Libcore");
    Field field = libcore.getDeclaredField("os");
    if (!field.isAccessible()) {
        field.setAccessible(true);
    }
    Object os = field.get(field);
    Method chmod = os.getClass().getMethod("chmod", String.class, int.class);
    chmod.invoke(os, path, mode);
}

显然,您需要拥有该文件才能进行任何权限更改。

于 2015-08-13T19:02:41.123 回答
0

这是使用Apache Commons.IO FileUtilsFile对象的适当方法的解决方案。

for (File f : FileUtils.listFilesAndDirs(new File('/some/path'), TrueFileFilter.TRUE, TrueFileFilter.TRUE)) {
    if (!f.setReadable(true, false)) { 
        throw new IOException(String.format("Failed to setReadable for all on %s", f));
    }
    if (!f.setWritable(true, false)) {
        throw new IOException(String.format("Failed to setWritable for all on %s", f));
    }
    if (!f.setExecutable(true, false)) { 
        throw new IOException(String.format("Failed to setExecutable for all on %s", f));
    }
}

这相当于chmod -R 0777 /some/path. 调整set{Read,Writ,Execut}able调用以实现其他模式。(如果有人发布适当的代码来执行此操作,我会很乐意更新此答案。)

于 2014-10-14T17:52:17.547 回答