我的小实用程序应用程序通过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.
答案 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代码为here和here