Невозможно создать файл java.io.IOException: нет такого файла или каталога - PullRequest
21 голосов
/ 19 сентября 2011

Я пытаюсь создать файл в файловой системе, но получаю следующее исключение:

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)`

У меня есть разрешение на запись в путь, однако файл не создан.

Ответы [ 8 ]

37 голосов
/ 19 сентября 2011

Если каталог ../.foo/bar/ не существует, вы не можете создать файл там, поэтому сначала убедитесь, что вы создали каталог.

Попробуйте что-то вроде этого:

File f = new File("somedirname1/somedirname2/somefilename");
if (!f.getParentFile().exists())
    f.getParentFile().mkdirs();
if (!f.exists())
    f.createNewFile();
20 голосов
/ 19 сентября 2011

Распечатайте полное имя файла или перейдите в отладчик.Когда меня смущают подобные ошибки, это означает, что мои предположения и ожидания не соответствуют действительности.Убедитесь, что вы можете увидеть что это за путь;это поможет вам понять, где вы ошиблись.

9 голосов
/ 06 декабря 2016

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

Permissions app

2 голосов
/ 19 сентября 2011

Возможно, вы захотите использовать метод Apache Commons IO FileUtils.openOutputStream (File) .Он имеет хорошие исключения, когда что-то пошло не так, а также создает необходимые родительские каталоги.Если все было правильно, то вы напрямую получаете OutputStream - очень аккуратно.

Если вы просто хотите touch файл, тогда используйте FileUtils.touch(File) вместо.

2 голосов
/ 19 сентября 2011

Попробуйте с

f.mkdirs() затем createNewFile()

1 голос
/ 12 января 2017

У меня такая же проблема при использовании rest-easy. После поиска я понял, что эта ошибка произошла, когда негде сохранить временные файлы . Таким образом, в tomcat вы можете просто создать папку tomcat-root / temp .

1 голос
/ 19 сентября 2011

File.isFile() равно false, если файл / каталог не существует, поэтому вы не можете использовать его для проверки того, пытаетесь ли вы создать каталог.Но это не первая проблема здесь.

Проблема в том, что промежуточные каталоги не существуют.Сначала вы хотите позвонить f.mkdirs().

0 голосов
/ 15 мая 2017

я исправил эту проблему с помощью этого кода в файловой системе Linux

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