【问题标题】:File.canWrite is not working as per expectationsFile.canWrite 未按预期工作
【发布时间】:2025-11-29 00:15:01
【问题描述】:

我正在尝试检查文件是否可写。我自己更改了所有用户的文件权限。但是如果我尝试运行该程序,它会显示“true”作为响应。如果我允许权限,那么它也显示“true”。

我的问题是什么?

try
  {

     File file = new File("D:/myproject_log/delivery_report_edr.out"); 

        if(!file.canWrite())
        {
            System.out.println("you can't write!!!");
        }
        else
            System.out.println("you can write!!!");
  }
  catch(Exception e)
  {
      e.printStackTrace();
  }

【问题讨论】:

  • 你还没说你把权限改为...
  • 您认为自己设置权限的方式有误,如果权限设置正确,您发布的代码应该可以正常工作。
  • 谁是文件的所有者,谁在运行应用程序?
  • 通过 Eclipse 我正在尝试运行该应用程序。我自己创建了该文件,但随后取出了写入该文件的权限。我只在本地桌面上进行的所有操作。

标签: java java-io


【解决方案1】:

它工作正常。我复制了您的代码并运行了两次。首先我得到了You can write,然后右键单击文件夹,进入属性并选择read only并再次运行程序,我得到了you can'写

因此,根据 canWrite() 方法的文档,它给了我预期的输出。请再次确认您的设置并检查。

【讨论】:

  • 我已将 Windows 操作系统中的权限更改为“拒绝”。使用相同的文件,我正在尝试记录我的条目。但是在使用相同文件创建记录器时,我收到异常说 java.io.FileNotFoundException: D:\myproject_log\delivery_report_edr.out (Access is denied)
  • @user1282551 你能说一下你是如何改变权限的吗?
  • 在 Windows 中,右键单击文件,然后进入属性...在安全选项卡中,我通过单击“拒绝”选项更改了写入权限。这是正确的方法吗???
  • @user1282551 抱歉,我无法为您提供更多帮助,但如果您将文件的常规属性更改为只读,我可以说那么你会得到正确的输出。
  • 文档说:“当且仅当文件系统实际包含由此抽象路径名表示的文件并且允许应用程序写入该文件时为真;否则为假”。在许多情况下,即使应用程序不允许写入文件,canWrite 也会返回 true,因此我根本不会将此称为确认文档。文档确实应该更清楚,它根本不会检查文件的权限。
【解决方案2】:

您是否尝试过使用java.nio.file.Files#isWritable 方法。以及 File#canWrite 吗?

【讨论】:

  • 当我询问是否可以按方向创建文件时,我遇到了与 canWrite 相同的问题,给我的答案不正确。但是你的回答已经解决了这个问题;)
【解决方案3】:

我还发现File.canWrite() 不可信,尤其是在网络驱动器上,即使文件写入失败,也经常返回true,反之亦然。我制作了自己的方法,实际上尝试将虚拟文件写入目录。这写起来很简单,而且万无一失。也许他们修好了。

【讨论】:

    【解决方案4】:

    我对位于 c:\programFiles\folder 中的文件有同样的问题,并且 File.canWrite 方法返回 true,我得到了同样的异常。 当我将文件夹属性的安全选项卡中定义的用户的写入权限更改为允许为真时,它没有给我任何例外。

    【讨论】: