Невозможно создать файл 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();

Будьте осторожны с разрешениями, вероятно, у вас их нет. Вы можете увидеть это в настройках -> приложения -> название приложения -> разрешения -> активен, если нет.

Приложение разрешений

Попробуй с

f.mkdirs() затем 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());
Другие вопросы по тегам