Невозможно создать файл java.io.IOException: такого файла или каталога нет.
Я пытаюсь создать файл в файловой системе, но получаю следующее исключение:
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)`
У меня есть разрешение на запись в путь, однако файл не создан.
9 ответов
Распечатайте полное имя файла или выполните отладку. Когда меня смущают подобные ошибки, это означает, что мои предположения и ожидания не соответствуют действительности. Убедитесь, что вы видите, что это за путь; это поможет вам понять, где вы ошиблись.
Если каталог ../.foo/bar/
не существует, вы не можете создать файл там, поэтому сначала убедитесь, что вы создали каталог.
Попробуйте что-то вроде этого:
File f = new File("somedirname1/somedirname2/somefilename");
if (!f.getParentFile().exists())
f.getParentFile().mkdirs();
if (!f.exists())
f.createNewFile();
Будьте осторожны с разрешениями, вероятно, у вас их нет. Вы можете увидеть это в настройках -> приложения -> название приложения -> разрешения -> активен, если нет.
Вы можете использовать Apache Commons IO
Метод FileUtils.openOutputStream(File). Он имеет хорошие исключения, когда что-то пошло не так, а также создает необходимые родительские каталоги. Если все было правильно, то вы напрямую получаете свой OutputStream - очень аккуратно.
Если вы просто хотите touch
файл затем использовать FileUtils.touch(File)
вместо.
У меня такая же проблема при использовании rest-easy. После поиска в то время как я понял, что эта ошибка произошла, когда нет места для хранения временных файлов. Так что в tomcat вы можете просто создать папку tomcat-root/temp.
File.isFile()
является false
если файл / каталог не существует, то вы не можете использовать его для проверки того, пытаетесь ли вы создать каталог. Но это не первая проблема здесь.
Проблема в том, что промежуточные каталоги не существуют. Вы хотите позвонить f.mkdirs()
первый.
Если имя файла включает ('/'), это может вызвать эту проблему.Unix воспринимает это как новый каталог.
Я исправил свою проблему с помощью этого кода в файловой системе Linux
if (!file.exists())
Files.createFile(file.toPath());