无法创建文件 java.io.IOException: 没有这样的文件或目录。

32

我想在文件系统上创建一个文件,但是一直出现以下异常:

java.io.IOException: No such file or directory

我已经有一个现有的目录,现在我想往这个目录写入一个文件。

// I have also tried this below, but get same error
// new File(System.getProperty("user.home") + "/.foo/bar/" + fileName);

File f = new File(System.getProperty("user.home") + "/.foo/bar/", fileName);

if (f.exists() && !f.canWrite())
        throw new IOException("Kan ikke skrive til filsystemet " + f.getAbsolutePath());

if (!f.isFile()) {
    f.createNewFile(); // Exception here
} else {
    f.setLastModified(System.currentTimeMillis());
}

获取异常:

java.io.IOException: No such file or directory
  at java.io.UnixFileSystem.createFileExclusively(Native Method)
  at java.io.File.createNewFile(File.java:883)`
我有对该路径的写入权限,但是文件还没有被创建。

请在第一行后添加以下内容,并显示输出结果:System.out.println(f); - Steve McLeod
你确定目录 .foo/bar 确实存在吗? - trojanfoe
1
/.foo/bar 中的点是什么? - denolk
@denolk:Unix中的隐藏目录 - Shervin Asgari
1
这个回答解决了你的问题吗?File.createNewFile() 抛出 IOException No such file or directory - jp_
8个回答

58
如果目录../.foo/bar/不存在,你就不能在那里创建文件,所以确保先创建目录。
尝试像这样做:
File f = new File("somedirname1/somedirname2/somefilename");
if (!f.getParentFile().exists())
    f.getParentFile().mkdirs();
if (!f.exists())
    f.createNewFile();

@Shervin,那么调试就是你必须要进行的下一步了。 :-) - Buhake Sindi
1
不错,帮了我很大的忙。 - emvidi

28

打印完整的文件名或在调试器中逐步检查。当我被这样的错误搞糊涂时,意味着我的假设和期望与现实不符。确保你可以看到路径;这将帮助你弄清楚哪里出了错。


1
无法想象为什么在5.5年后被投票下降,当它被原帖作者接受并在评论中确认为正确的修复时。感觉很报复性。匿名时很容易这样做。 - duffymo
虽然它很容易,但是谁下投票的人也会损失声誉,所以投反对票并不是“免费”的。 - Shervin Asgari
2
我已经足够了,所以我不在乎。令我烦恼的是态度,而不是失去声望。 - duffymo
我也尝试了Bohemian的方法来检查我的视频路径是否存在,但是它们确实存在,仍然会抛出错误!!需要帮助。 - Akash Dubey
你还是做错了。相信JVM,继续寻找,不要劫持6年前的答案。 - duffymo
显示剩余2条评论

13

处理权限时要小心,可能您没有其中一些权限。您可以在设置-> 应用程序->应用程序名称->权限中查看是否处于活动状态。

Permissions app


6

尝试使用f.mkdirs()然后调用createNewFile()


3
你可以尝试使用 File.separator 代替 '/'。该方法可在此链接中查看:http://download.oracle.com/javase/6/docs/api/java/io/File.html#separator - jmj

2
您可能想要使用Apache Commons IOFileUtils.openOutputStream(File)方法。当出现错误时,它会提供良好的异常消息,并创建必要的父目录。如果一切顺利,您将直接获得您的输出流 - 非常简洁。
如果您只是想"touch"文件,则应改用FileUtils.touch(File)

1
我在使用rest-easy时遇到了相同的问题。搜索一段时间后,我发现当没有地方存放临时文件时会出现此错误。因此,在tomcat中,您可以创建tomcat-root/temp文件夹。

1

File.isFile() 如果文件/目录不存在,则返回 false,因此无法用它来测试您是否正在尝试创建目录。但这并不是首要问题。

问题是中间目录不存在。您需要先调用 f.mkdirs()


0

我通过这段代码解决了在Linux文件系统上的问题。

if (!file.exists())
    Files.createFile(file.toPath());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接