在创建文件内部之前检查目录中的写访问权限

时间:2009-08-13 13:58:21

标签: java file permissions

我的小实用程序应用程序通过GUI文件选择器询问用户输出目录。 然后,经过一些处理后,它会在此输出目录中创建大量文件。

我需要检查应用程序是否具有写访问权限,以便通知用户并执行操作 不继续处理(可能需要很长时间)

我的第一次尝试是 java.io.File canWrite()方法。但这不起作用 因为它处理目录条目本身而不是它的内容。我至少看过了 Windows XP文件夹的一个实例,可以重命名或删除但不能创建任何文件 在其中(因为权限)。这实际上是我的测试用例。

我最终解决了以下解决方案

//User places the input file in a directory and selects it from the GUI
//All output files will be created in the directory that contains the input file
File fileBrowse = chooser.getSelectedFile(); //chooser is a JFileChooser
File sample = new File(fileBrowse.getParent(),"empty.txt"); 
try
{
     /*
      * Create and delete a dummy file in order to check file permissions. Maybe 
      * there is a safer way for this check.
      */
      sample.createNewFile();
      sample.delete();
}
catch(IOException e)
{
      //Error message shown to user. Operation is aborted
}

然而,这对我来说并不优雅,因为它只是试图实际创建一个文件并检查操作是否成功。

我怀疑必须有一个更好的方法,但到目前为止我找到的所有解决方案 与安全管理器和东西处理Java Applet而不是独立的应用程序。 我错过了什么吗?

之前检查目录内文件访问的推荐方法是什么 实际上写文件?

我正在使用Java 5.

3 个答案:

答案 0 :(得分:19)

您可以检查文件权限,确保目录存在,并进行大量检查或找到一个可以检查所有内容的库但是(!)不是最好的方法检查试试?如果您检查权限和文件系统更改...您将不得不更改您的代码。但是,如果你能写一个文件,试着写一个文件就会告诉你。

您的解决方案不一定是最优雅的解决方案。它不是一个廉价的硬编码补丁或丑陋的东西。这只是普通的代码。它会一直有效。但是如果你不喜欢在代码中看到检查,只需将它放在类中,只有目标是检查可能的写入。事实上,你应该把它放在一个实用工具类中,而不管你是否优雅。

另一个解决方案是将整个写入硬盘驱动器代码放在try中。如果你不能写,那么整个部分都会被跳过,你会在catch部分给出一条消息给用户反馈。

答案 1 :(得分:0)

即使您在最终路径上调用canWrite,它也不起作用?

File sample = new File(fileBrowse.getParent(),"empty.txt"); 

if (sample.canWrite()) {
    doSomethingUseful(sample);
} else {
    notifyUser();
}

答案 2 :(得分:0)

您可以使用FilePermission获取详细信息。 我找到了一种方法,您需要实现SecurityManager代码为herehere