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

我的小实用程序应用程序通过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 } 

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

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

在实际编写文件之前,建议在目录中检查文件访问的方法是什么?

我使用的是Java 5。

您可以检查文件权限,确保目录存在,并进行大量检查或找到一个可以检查所有检查的库但是(!)不是检查的最佳方法吗? 如果您检查权限和文件系统更改…您将不得不更改您的代码。 但是,尝试编写文件将始终告诉您是否可以编写文件。

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

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

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

 File sample = new File(fileBrowse.getParent(),"empty.txt"); if (sample.canWrite()) { doSomethingUseful(sample); } else { notifyUser(); } 

如果/当文件无法写入时,我会说集中精力提供良好的用户体验,而且不要费心预先检查路径。 既然你说处理过程很简单,那就没办法保证你完成后仍能写到那条路径。 在您检查和写入时,或磁盘可能填满时,权限可能会发生很大变化,或者……

您可以使用FilePermission来获取详细信息。 我找到了一种方法,你需要在这里和这里实现SecurityManager代码

使用Java 1.8我能够使用以下内容。

 Set permissions = Files.getPosixFilePermissions(Paths.get(destDir), LinkOption.NOFOLLOW_LINKS); Assert.assertTrue("User did not have read permission.", permissions.contains(PosixFilePermission.OWNER_READ)); Assert.assertTrue("User did not have execute permission.", permissions.contains(PosixFilePermission.OWNER_EXECUTE)); Assert.assertTrue("User did not have write permission.", permissions.contains(PosixFilePermission.OWNER_WRITE)); Assert.assertFalse("Group did have read permission.", permissions.contains(PosixFilePermission.GROUP_READ)); Assert.assertFalse("Group did have execute permission.", permissions.contains(PosixFilePermission.GROUP_EXECUTE)); Assert.assertFalse("Group did have write permission.", permissions.contains(PosixFilePermission.GROUP_WRITE)); Assert.assertFalse("Others did have read permission.", permissions.contains(PosixFilePermission.OTHERS_READ)); Assert.assertFalse("Others did have execute permission.", permissions.contains(PosixFilePermission.OTHERS_EXECUTE)); Assert.assertFalse("Others did have write permission.", permissions.contains(PosixFilePermission.OTHERS_WRITE));