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

时间:2009-05-28 09:10:15

标签: java file-io

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

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

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

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

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

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

17 个答案:

答案 0 :(得分:35)

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

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

有问题的文件是“var \ log”,绝对路径确实是指普通子目录(不是虚拟商店)中的现有文件。这可以从IDE中看到。

答案 1 :(得分:16)

似乎在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)完全相同 - 其中name可以是URL或绝对文件路径。

答案 2 :(得分:15)

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

答案 3 :(得分:11)

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

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

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

答案 4 :(得分:3)

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

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

我建议使用try-catch块来包围它,BTW。

答案 5 :(得分:3)

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

如果你说

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

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

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

现在这将返回true。

答案 6 :(得分:2)

为概括此问题,在将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

希望这会有所帮助。

答案 7 :(得分:2)

显然有很多可能的原因,以前的答案记录得很好,但这是我在一个特定情况下解决这个问题的方法:

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

希望这可以帮助别人省下自己的头发。

答案 8 :(得分:1)

就我而言

文件保存在

filepath = Environment.getExternalStorageDirectory().getAbsolutePath()+ "/VRSI/Audio/"+encrypted_filename+".mp3";

它存储在

/storage/emulated/0/VRSI/Audio/82B0999F16251F0DFE849F380D6AAEEA.mp3

当我得到文件路径时

/storage/emulated/0/Android/data/com.numerotec.vrsi/files/VRSI/Audio/AF7DC6C0C0B3EF3529EC70DAEF2324E0.mp3

所以我将字符串“Android/data/com.numerotec.vrsi/files/”替换为空

之后

if (file.getAbsoluteFile().exists())
{
    // write your code
} 

工作正常

答案 9 :(得分:1)

如果选中["隐藏已知文件类型的扩展名。"],则打开窗口" t.txt.txt"当键入" t.txt"在[资源管理器] / [运行窗口],但编程不。

答案 10 :(得分:0)

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

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

恭敬地,

@ Carpenter1010

答案 11 :(得分:0)

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

filePath = filePath.trim();

这将从所有不需要的字符中清除您的字符串

答案 12 :(得分:0)

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

希望有帮助。

答案 13 :(得分:0)

FWIW,这是在另一个地方发生的。

App是当前目录的名称。 File("")通常会返回File("").exists()false技巧有效,并且将返回File(("").getAbsoluteFile().exists()(假设当前目录存在...)

答案 14 :(得分:0)

如果失败的情况涉及将其作为另一个用户运行,并且您使用的是Windows Vista / Windows 7,则可能是由VirtualStore引起的,这种机制是Windows允许非特权用户“写入”它通常不能的地方。但是,更改存储在每个用户帐户专用的“%USERPROFILE%\ AppData \ Local \ VirtualStore \”中。

答案 15 :(得分:-1)

我认为你应该使用反斜杠,比如:

文件文件=新文件(" C:\\用户\\ utilities \\ data \\ someTextFile.txt"); (两个反斜杠,不是拼写错误)

应该解决问题:)

答案 16 :(得分:-1)

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

如果您的File的引用变量为f,例如:File f = new File(“ path”);

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