当文件存在时,File.exists()返回false
我遇到了一个我似乎无法find任何逻辑的bug。 我有这个File对象,它是这样创build的:
File file = new File("utilities/data/someTextFile.txt");
然后我做file.exists()
,它返回false
( file.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”); (两个反斜杠,不是错字)
应该解决问题:)