2011-09-12 52 views
4

我需要检查特定目录的文件创建权限。在java中检查文件创建权限的最佳方法是什么

我已经试过:

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()返回true)。

我到底做过黑客与此类似:

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

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

+0

你所描述的基本上与我在第三上市中所做的是一样的。正如我所说的,我必须收集PC上出现的几乎所有f的文件创建权限。我将在这些目录中使用此信息进行分析和稍后创建文件。这意味着我会有这种“异步活动”的可能性,我对此感到满意。问题是,创建/删除每个文件夹中的文件只是为了弄清楚是否有权限看起来不是一个好soution ... –

相关问题