代码之家  ›  专栏  ›  技术社区  ›  kazanaki

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

  •  26
  • kazanaki  · 技术社区  · 16 年前

    我的小实用程序通过一个GUI文件选择器向用户请求一个输出目录。 然后它会在这个输出目录中创建很多文件,经过一些处理。

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

    我的第一次尝试是 CANWRESE() 方法 java.io.file文件 . 但是这个不行 因为它处理的是目录条目本身,而不是其内容。我至少见过 可以重命名或删除但不能创建任何文件的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小程序而不是独立应用程序。 我错过什么了吗?

    以前在目录中检查文件访问的推荐方法是什么 真的在写文件?

    我使用的是Java 5。

    5 回复  |  直到 8 年前
        1
  •  19
  •   Philippe Carriere    12 年前

    您可以检查文件权限,确保目录存在,并进行大量检查,或者找到一个库来为您进行所有检查。 但是,(!) 不是最好的检查方法吗?如果检查权限和文件系统更改…您必须更改代码。但是试图写一个文件总是会告诉你是否可以写一个文件。

    你的解决方案不必是最优雅的。它不是一个便宜的硬编码补丁或丑陋的东西。这只是正常的代码。它将永远有效。但是,如果您不想看到代码中的检查,只需将其放入类中进行分离,这样做的唯一目的就是检查是否有可能进行编写。事实上,你应该把它放在一个实用类,无论你是否喜欢优雅。

    另一个解决方案是将您的整个写入硬盘代码,在尝试。如果你不能写,整个部分就会被跳过,你会在catch部分向用户反馈一条消息。

        2
  •  0
  •   dfa    16 年前

    即使你调用它也不起作用 canWrite 最后路径 ?

    File sample = new File(fileBrowse.getParent(),"empty.txt"); 
    
    if (sample.canWrite()) {
        doSomethingUseful(sample);
    } else {
        notifyUser();
    }
    
        3
  •  0
  •   Mark Bessey    16 年前

    如果/当文件无法写入时,我会说集中精力提供良好的用户体验,不要费心预先检查路径。既然您说处理过程需要一本大部头书,那么就无法保证在该路径结束时仍然能够写入该路径。权限很可能在检查和写入之间发生更改,或者磁盘可能已满,或者…

        4
  •  0
  •   urmalp    16 年前

    你可以使用 FilePermission 获取详细信息。 我找到了一个你需要实现的方法 SecurityManager 代码是 here here

        5
  •  0
  •   ElectronicBlacksmith    8 年前

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

    Set<PosixFilePermission> 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));