【问题标题】:What is the best way to check file creation permissions in java在java中检查文件创建权限的最佳方法是什么
【发布时间】:2011-11-15 05:37:21
【问题描述】:

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

我试过了:

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 上的几乎所有文件夹获取此类权限。

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

【问题讨论】:

    标签: java file permissions directory file-permissions


    【解决方案1】:

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

    【讨论】:

    • 您所描述的与我在第三个清单中所做的基本相同。正如我所说,我必须收集 PC 上几乎所有 fs 的文件创建权限。我将使用此信息进行分析,然后在其中一些目录中创建文件。这意味着我将有可能进行这种“异步活动”,我对此表示满意。问题是在每个文件夹中创建/删除文件只是为了弄清楚是否有权限看起来不是一个好的解决方案......
    猜你喜欢
    • 2014-03-28
    • 2017-04-21
    • 2018-03-19
    • 2013-06-22
    • 2012-03-22
    • 2011-10-28
    • 2016-07-09
    • 2010-09-18
    相关资源
    最近更新 更多