当文件存在时,File.exists()返回false

ats*_*joo 84 java file-io

我遇到了一个我似乎无法找到任何逻辑的错误.我有这个File对象,它是这样创建的:

File file = new File("utilities/data/someTextFile.txt");
Run Code Online (Sandbox Code Playgroud)

然后我做了file.exists(),它返回false(!?).如果找不到该文件,我正在登录f.getAbsolutePath()文件.当我看路径时,似乎没问题.我可以将完整路径复制粘贴到Windows中的"运行"窗口,文件打开正常.

该文件始终存在,在我的应用程序运行期间不会被删除或更改.它位于本地机器上.

这似乎只在某些情况下发生.我可以随时重现故障,但我确信文件对象的路径不会因我为重现故障而采取的操作而改变.

什么可以导致file.exists()返回虚假?这是否与权限或文件锁等有关?

Rom*_*nka 37

我在Windows 7上看到以下情况:

file.exists() == false
file.getAbsoluteFile().exists() == true
Run Code Online (Sandbox Code Playgroud)

有问题的文件是"var\log",绝对路径确实是指正常子目录(不是虚拟存储)中的现有文件.这可以从IDE中看到.

  • 我刚想出来了:http://bugs.sun.com/bugdatabase/view_bug.do;:YfiG?bug_id = 4483097显然,文件上运行的操作是针对当前目录解析的,而getAbsolutePath是针对user.dir解析的.如果这两条路径不匹配,则会得到相互矛盾的结果.恶魔! (16认同)
  • 我有完全相同的问题,我试图使用两种方法来检查文件是否存在,但我仍然只在Windows 7上出现错误!任何的想法? (3认同)
  • @RomanZenka 链接已损坏,工作链接是 https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4483097 (2认同)

小智 16

似乎在Java中如何指定路径存在差异.

例如,如果文件路径被指定为file:/C:/DEV/test.txt接着

File f = new File(filename);
f.exists();
Run Code Online (Sandbox Code Playgroud)

会回来的false.该路径可能在资源管理器或浏览器中有效,但它是一个URL而不是绝对文件路径.

但另一方面,如果文件路径指定为C:/DEV/test.txt那么

File f = new File(filename);
f.exists();
Run Code Online (Sandbox Code Playgroud)

将返回,true因为路径不是URL,但它是绝对路径.

使用Spring Framework正是这样ResourceUtils.getFile(filename)做的 - 其中name可以是URL或绝对文件路径.

  • 我不希望`file:/ C:/ DEV/test.txt`作为路径名工作.它是一个URL而不是一个路径名.虽然有些人犯了这个错误,但没有证据表明OP有...... (4认同)

Tom*_*ine 15

如果进程没有权限来判断文件是否存在,则返回false.可以打开文件,但不能通过普通方法告诉它是否存在.

  • 有趣.你能扩展一下吗?您有哪些特定权限? (18认同)

小智 11

在我的案例中,上述答案并没有帮助.如上所述,我有:

file.exists() => false
file.getAbsoluteFile().exists => true
Run Code Online (Sandbox Code Playgroud)

造成这种情况的根本原因是Windows 7计算机所有者已经修改了CMD的注册表,因此它会自动运行命令以在特定目录中启动以使用Python.这个修改破坏了Java 1.6代码,它显然在Windows上使用CMD进行某些文件操作,例如.从注册表中删除自动运行解决了这个问题.exists()

  • 天哪,它确实有效(两者),我只是愚蠢地检查错误的文件,并遇到这个问题来找出为什么它们都不适合我:)顺便说一句,似乎“()”中缺少`exists` 之后的第二行;) (2认同)

小智 5

当选中[“隐藏已知文件类型的扩展名。”]时,在[资源管理器]/[运行窗口]中键入“t.txt”时,窗口会打开“t.txt.txt”,但以编程方式不会打开。

  • 我遇到了这个问题,问题是我在 C:\test 中创建了一个名为“testFile.txt”的 txt 文件。我使用路径 C:\test\testFile.txt 引用该文件,但不起作用。这是因为该文件实际上已保存为 testFile.txt.txt,因此对上述解决方案进行了投票(老问题,但没有接受的答案!) (2认同)