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


90

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

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

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

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

这似乎仅在某些情况下发生。我可以随时重现故障,但是我确定文件对象的路径不会因我为重现故障所采取的措施而改变。

什么会导致file.exists()返回假?这与权限或文件锁定等有关吗?


因此,即使existing()返回false,也可以从文件中读取吗?
哈里·莱姆

是的,即使existing()返回false,我也可以读取文件。
2009年

1
重现故障究竟需要什么?
user85421

1
它在一个应用程序内部,该应用程序调用用matlab编写并编译为Java应用程序的函数。似乎更改“当前目录”的matlab函数导致出现此问题。创建文件对象时,我使用的是绝对路径,所以这应该不成问题-但似乎是这样。我当然已经验证了文件对象的绝对路径,并且它是正确的(与matlab函数更改当前目录之前的路径相同)。
09年

7
您是否有机会使用远程目录(例如NFS挂载)?
Tomer Gabel,2009年

Answers:


42

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

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

有问题的文件是“ var \ log”,绝对路径确实引用了普通子目录(而不是虚拟存储)中的现有文件。这是从IDE中看到的。


16
我只是想出了办法:bugs.sun.com/bugdatabase/view_bug.do ; : YfiG?bug_id=4483097显然,针对当前目录解析文件上运行的操作,而针对user.dir解析getAbsolutePath。如果这两个路径不匹配,则会产生冲突的结果。恶魔!
罗曼·曾卡(Roman Zenka)2010年

3
我遇到了完全相同的问题,我尝试使用两种方法来检查文件是否存在,但仍然仅在Windows 7上会出现错误!任何想法?
Dejell

@Odelya:您正在使用哪种IDE?-Duser.dir设置为什么?我的问题是由-Duser.dir设置为与当前工作目录不同的目录引起的。
Roman Zenka 2010年

1
对于正在处理动态Web项目的任何人,使用file.exists()都会引发异常,请使用file.getAbsoluteFile()。exists()来检查WEB-INF目录中的文件(一般性提示,而非Windows 7专用) )。
PS

考虑针对此答案和评论创建单独的质量检查
Bato-Bair Tsyrenov,

17

似乎在Java中指定路径的方式有所不同。

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

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

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

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

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

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

使用Spring FrameworkResourceUtils.getFile(filename)可以做到这一点-名称可以是URL或绝对文件路径。


5
我不希望file:/C:/DEV/test.txt用作路径名。这是一个URL,而不是路径名。尽管有些人犯了这个错误,但没有证据表明OP具有...
Stephen C

15

如果该进程没有权限告诉文件是否存在,它将返回false。可能可以打开文件,但无法通过常规方法告知该文件是否存在。


20
有趣。您可以对此进行扩展吗?您要考虑哪些特定权限?
克莱门特

这里可以是java.nio.file.AccessDeniedException的阻止功能,可以伸出文件/目录存在。例如,如果您在FAR或其他文件资源管理器中保持dir打开,然后删除所有嵌套文件的dir并检查此dir是否存在,则可以获取为您保留的临时文件的AccessDeniedException(扩展IOException)。在这种情况下,Files.exists对于IOException返回false。
beluha

11

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

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

造成此问题的根本原因是Windows 7计算机所有者已修改了CMD注册表,以便它将自动运行命令以在特定目录中启动以使用Python。此修改削弱了Java 1.6代码,该代码显然在Windows上使用CMD进行某些文件操作,例如。从注册表中消除自动运行可解决此问题。exists()


1
3.5年后,我遇到了同样的问题。每次启动cmd.com时,我都设置了一个自动运行脚本来配置环境变量。它甚至没有更改当前目录-只是一些doskey宏和一些环境变量。我删除了自动运行程序,只是手动运行了文件中的命令,突然File.exists()正常工作。
Homr Zodyssey'3

1
OMG,它确实有效(它们两者都有效),我只是在愚蠢地检查错误的文件,然后遇到了这个问题,以找出为什么它们都不对我有用:)顺便说一句,()第二行之后似乎缺少了exists; )
RAM237 '17

3

显然,有很多可能的原因,前面的答案很好地记录了它们,但是在一种特殊情况下,这是我解决此问题的方法:

我的一个学生遇到了这个问题,我差点把头发弄乱,试图弄清楚。事实证明,该文件不存在,即使看起来确实如此。问题是Windows 7配置为“隐藏已知文件类型的文件扩展名”。这意味着,如果文件似乎具有名称“ data.txt”,则其实际文件名是“ data.txt.txt”。

希望这可以帮助其他人节省一些头发。


我认为这不是我的问题。正如我的问题中提到的那样:“我可以将完整路径复制粘贴到Windows中的“运行”窗口中,并且文件可以正常打开。”,这意味着该文件确实存在。
2015年

3

new File命令仅使用给定的路径名​​创建文件的实例。它实际上并没有在硬盘上创建文件。

如果你说

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

仅当存在具有相同路径的文件时,才可以返回true。如果要检查第一行中声明的相同文件,则可能需要以这种方式使用它。

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

现在,这将返回true。


简短解释:每次使用new关键字对构造函数的调用都会创建一个Object-与本例中Class描述的对象相同,其名称为File!所以不是File!=描述符的实例:)
ceph3us

3

如果不想每次都要调用方法时都要处理getAbsoluteFile()调用,则最好使用绝对路径创建文件实例。这应该可以解决问题:

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

我建议用一个尝试捕获块BTW包围它。


3

为了概括该问题,在将URL / URI转换为本地路径时会出现问题。

Example: URL url = file:/D:/code%20repo%20sample/sample.txt

// To remove url reference
String localPath = url.getPath();  
> /D:/code%20repo%20sample/sample.txt

// Decoding reserved characters in url from hexadecimal to character
URLDecoder.decode(localPath, StandardCharsets.UTF_8.toString()); 
> /D:/code repo sample/sample.txt

希望这可以帮助。


2

当选中[“隐藏已知文件类型的扩展名。”]时,在[explorer] / [运行Windows]中键入“ t.txt”时,窗口打开“ t.txt.txt”,但是在编程上却没有。


1
我遇到了这个问题,问题是我在C:\ test中创建了一个名为“ testFile.txt”的txt文件。我使用路径C:\ test \ testFile.txt引用了此文件,但该路径无效。这是因为文件实际上已保存为testFile.txt.txt,因此对上述解决方案投了赞成票(旧问题,但没有被接受的答案!)
Theblacknight 2012年

上帝的窗户是如此糟糕。
2014年

0

大家反应良好。我发现这似乎与Java访问C:Windows上的根目录有关。任何其他目录应该罚款,但由于某些原因,特别提到C:\C:C:/会给出错误。我已经解决了这个非常相似的问题,方法new File("C:");是使用新的陷阱并将其替换为new,File(System.getProperty("file.separator"));否则您应该可以硬编码“ \”而不是使用“ c:”作为文件目录,它可能会解决。不优雅,但是在这个项目上为我完成了工作。

希望对您有所帮助。可能不是正确的解决方案,但至少对我有用。我在JRE 1.6, Win 7。干杯!

尊敬,

Car


0

如果失败的情况涉及以另一个用户身份运行它,而您使用的是Windows Vista / Windows 7,则可能是由VirtualStore引起的,VirtualStore是Windows让非特权用户“写入”的机制,通常不会这样做。但是,更改存储在每个用户帐户专用的“%USERPROFILE%\ AppData \ Local \ VirtualStore \”中。


1
我在Windows XP x86上运行
atsjoo,2009年

0

当上面没有任何东西对我有用时,我尝试了

filePath = filePath.trim();

这将从任何不需要的字符中清除您的字符串


0

我最近遇到了同样的问题。我所做的就是卸载Netbeans,从C驱动器删除了netbeans文件夹,程序文件,更新,programData,几乎在所有地方。然后重新安装。现在工作正常。采取上述操作之前,请不要忘记备份netbeans项目文件夹。

希望能帮助到你。


0

使用某些IDE(可能是)和某些操作系统(例如:window),默认情况下,它们对文件没有写权限。因此,如果您尝试执行file.exists(),它将显示为false。为了解决这个问题,请执行以下操作

如果File的ref变量是f,例如:File f = new File(“ path”);

因此,要使其正常工作,请用鼠标选择f,然后转到“搜索”菜单>“写访问权限”>“工作区”。希望它会起作用。


-2

我认为您应该改用反斜杠,例如:

文件文件=新文件(“ C:\\ User \\ utilities \\ data \\ someTextFile.txt”);(两个反斜线,而不是错字)

应该解决问题:)


3
我认为这个问题与绝对路径和相对路径更相关。即使在Windows路径中,斜杠在Java中也有效。
рüффп
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.