我需要检查特定目录的文件创建权限。
我试过了:
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文件创建权限,而不会导致上述性能问题和黑客攻击?
答案 0 :(得分:1)
测试任何资源的可用性/可用性的最佳方法是尝试使用它。在这种情况下,new FileOutputStream(new File(dir, name))
。如果目录不可写,或者文件已经存在且不可写等等,它将抛出IOException
。当您执行该代码时,操作系统必须执行所有这些检查:没有必要尝试复制它,即使你100%正确,这是不可能的,你仍然会引入一个时间窗口,其中由于异步活动,先前的“真实”条件可能变为“假”。你必须从文件创建中捕获异常,并在catch块中编写代码来处理它们:为什么要写两次所有这些?