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

2022-09-01 13:23:11

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

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

我的第一次尝试是java.io.FilecanWrite()方法。但这不起作用,因为它处理的是目录条目本身,而不是其内容。我见过至少一个可以重命名或删除的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
}

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

我怀疑一定有更好的方法,但是到目前为止,我在Security Managers和其他东西中发现的所有解决方案都与Java小程序而不是独立应用程序有关。我错过了什么吗?

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

我使用的是Java 5。


答案 1

您可以检查文件权限,确保目录存在,并进行大量检查或找到一个为您完成所有这些检查的库,但是(!)不是最好的检查方法吗?如果您检查权限并且文件系统发生更改...你将不得不改变你的代码。但是尝试编写文件总是会告诉您是否可以写入文件。

您的解决方案不必是最优雅的解决方案。它不是一个廉价的硬编码补丁或丑陋的东西。这只是普通的代码。它将永远有效。但是,如果您不喜欢在代码中看到该检查,只需将其放在类中将其分开,其唯一目标是检查编写的可能性。事实上,你应该把它放在一个实用类中,无论你喜欢与否。

另一种解决方案是将整个写入硬盘驱动器的代码放在尝试中。如果您无法编写,则将跳过整个部分,并在捕获部分中通过消息向用户提供反馈。


答案 2

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

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

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