在java中检查文件创建权限的最佳方法是什么

时间:2011-09-12 10:27:55

标签: java file permissions directory file-permissions

我需要检查特定目录的文件创建权限。

我试过了:

try {
    AccessController.checkPermission(new FilePermission("directory_path", "write"));
    // Have permission
} catch (SecurityException e) {
    // Doesn't have permission
}

...但是这总是会抛出SecurityException(据我所知,这会检查不是基本的fs权限,而是一些应该明确配置的JVM设置)。

另一种可能的方法是使用这样的东西:

File f = new File("directory_path");
if(f.canWrite()) {
    // Have permission
} else {
    // Doesn't have permission
}

...但即使我无法在指定目录中创建文件,这也会返回true(例如,当我在没有管理员权限的用户下运行我的应用程序时,我无法在“c:\”中创建文件,但f.canWrite()会返回真)。

最后我做了类似的黑客攻击:

File f = new File("directory_path");
try {
    File.createTempFile("check", null, f).delete();

    // Have permission
} catch (IOException e) {
    // Doesn't have permission
}

...但这可能仅作为临时解决方案,因为我需要获得客户端fs上几乎所有文件夹的此类权限。

有没有人知道如何很好地获得REAL文件创建权限,而不会导致上述性能问题和黑客攻击?

1 个答案:

答案 0 :(得分:1)

测试任何资源的可用性/可用性的最佳方法是尝试使用它。在这种情况下,new FileOutputStream(new File(dir, name))。如果目录不可写,或者文件已经存在且不可写等等,它将抛出IOException。当您执行该代码时,操作系统必须执行所有这些检查:没有必要尝试复制它,即使你100%正确,这是不可能的,你仍然会引入一个时间窗口,其中由于异步活动,先前的“真实”条件可能变为“假”。你必须从文件创建中捕获异常,并在catch块中编写代码来处理它们:为什么要写两次所有这些?