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

我遇到了一个我似乎无法find任何逻辑的bug。 我有这个File对象,它是这样创build的:

File file = new File("utilities/data/someTextFile.txt"); 

然后我做file.exists() ,它返回falsefile.exists() )。 如果找不到文件,我将f.getAbsolutePath()logging到文件中。 当我看着path,似乎没问题。 我可以将完整的path复制粘贴到Windows的“运行”窗口中,并且文件可以正常打开。

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

这似乎只发生在某些情况下。 我可以在任何时候重现错误,但是我确定文件对象的path不会被我为重现错误所做的操作改变。

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

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

 file.exists() == false file.getAbsoluteFile().exists() == true 

有问题的文件是“var \ log”,绝对path指的是在一个正常的子目录(不是一个虚拟商店)的现有文件。 这是从IDE中看到的。

如果进程没有权限判断文件是否存在,它将返回false。 有可能打开一个文件,但是如果它存在,就不能用普通的方法告诉它。

看起来在Java中如何指定path是有区别的。

例如,如果文件path被指定为file:/C:/DEV/test.txt那么

 File f = new File(filename); f.exists(); 

将返回false 。 该path可能在浏览器或浏览器中工作,但它是一个URL而不是绝对文件path。

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

 File f = new File(filename); f.exists(); 

将返回true因为path不是一个URL,但它是一个绝对path。

使用Spring框架就是ResourceUtils.getFile(filename)所做的 – 名称可以是URL或绝对文件path。

以上的答案对我来说没有帮助。 如上所述,我有:

 file.exists() => false file.getAbsoluteFile().exists => true 

造成这种情况的根本原因是Windows 7计算机所有者已经修改了CMD的registry,以便它能够自动运行一个命令,以在特定的目录中启动以使用Python。 这种修改使Java 1.6代码显得残酷,在Windows上对某些文件操作(如exists()使用CMD 。 从registry中消除自动运行解决了这个问题。

new File命令只是使用给定的path名​​创build一个文件的实例。 它实际上并不在硬盘上创build一个文件。

如果你说

 File file = new File ("path"); file.exists() 

只有存在具有相同path的现有文件时,才能返回true。 如果您打算检查在第一行中声明的同一文件,则可能需要使用这种方法。

 File file = new File ("path"); file.createNewFile(); file.exists(); 

现在这将返回true。

当[“隐藏已知文件types的扩展名”]被选中时,在[资源pipe理器] / [运行窗口]中键入“t.txt”时,窗口打开“t.txt.txt”,但不能编程。

每个人都很好回应 我发现这似乎是Java访问Windows上的根C:目录的问题。 任何其他目录应该没问题,但由于某些原因,特别提到C:\C:C:/可能会给出错误。 我已经解决这个非常类似的问题,通过捕获提到new File("C:"); 并用新的File(System.getProperty("file.separator"));replace它File(System.getProperty("file.separator")); 或者你应该能够代替“\”来代替“c:”作为你的文件目录,它可能会工作。 不是很优雅,但在这个项目上完成了我的工作。

我希望它有帮助。 可能不是正确的解决scheme,但至less它为我工作。 我在JRE 1.6, Win 7 。 干杯!

尊敬,

@ Carpenter1010

显然有一些可能的原因,以前的答案logging他们很好,但这是我在一个特定的情况下解决这个问题:

我的一个学生有这个问题,我几乎把我的头发试图找出来。 事实certificate,该文件不存在,即使它看起来像。 问题是Windows 7被configuration为“隐藏已知文件types的文件扩展名”。 这意味着如果文件名称为“data.txt”,则其实际文件名为“data.txt.txt”。

希望这有助于他人自救一些头发。

如果发生故障的情况涉及以另一个用户的身份运行它,并且在Windows Vista / Windows 7上,则可能是由VirtualStore导致的,Windows让非特权用户“写入”的机制通常不能。 但是,这些更改存储在每个用户帐户专用的“%USERPROFILE%\ AppData \ Local \ VirtualStore \”中。

如果您不想在每次调用方法时处理getAbsoluteFile()调用,则最好使用绝对path创build文件实例。 这应该做的伎俩:

 File file = new File("utilities/data/someTextFile.txt").getAbsoluteFile(); 

我build议围绕它与一个try-catch块,顺便说一句。

我认为你应该使用反斜杠,像这样:

File file = new File(“C:\\ User \\ utilities \\ data \\ someTextFile.txt”); (两个反斜杠,不是错字)

应该解决问题:)