Подтвердить что ты не робот

File.createNewFile() thowing IOException Нет такого файла или каталога

У меня есть метод, который записывает в файл журнала. Если файл существует, он должен быть добавлен к нему, если нет, то я хочу, чтобы он создавал новый файл.

if (!file.exists() && !file.createNewFile()) {
    System.err.println("Error with output file: " + outFile
        + "\nCannot create new file.");
    continue;
}

У меня есть это, чтобы проверить, что файл может быть создан. file - объект java.io.File. createNewFile бросает исключение IOException: нет такого файла или каталога. Этот метод работает отлично, так как я написал его несколько недель назад и только недавно начал делать это, хотя я не знаю, что я мог бы изменить. Я проверил, каталог существует, и у меня есть права на запись для него, но потом я подумал, что он должен просто вернуть false, если он не может сделать файл по какой-либо причине.

Есть ли что-то, что мне не хватает, чтобы заставить это работать?

4b9b3361

Ответ 1

Обычно это то, что вы недавно изменили, сначала с вашего образца кода, если файл не существует, а не создает новый файл - вы пытаетесь что-то закодировать - что это такое?

Затем просмотрите список каталогов, чтобы узнать, существует ли он на самом деле, и выполните println/toString() в объекте file и getMessage() для исключения, а также трассировку стека печати. ​​

Затем, начните с нуля знания снова и повторите шаг за шагом каждый шаг, который вы используете, чтобы попасть сюда. Вероятно, вы застряли там где-то, концептуализируясь в коде (потому что он работал) - вы просто проследите каждый шаг в деталях, вы его найдете.

Ответ 2

попробуйте обеспечить родительский каталог с помощью:

file.getParentFile().mkdirs()

Ответ 3

Возможно, каталог, в котором создается файл, не существует?

Ответ 4

В соответствии с [java docs] (http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html#createNewFile()) createNewFile создаст для вас новый файл.

Atomically creates a new, empty file named by this abstract pathname if and only if a file with this name does not yet exist.

Учитывая, что createNewFile является атомарным и не будет переписывать существующий файл, вы можете переписать свой код как

try {
    if(!file.createNewFile()) {
        System.out.println("File already exists");
    } 
} catch (IOException ex) {
    System.out.println(ex);
}

Это может сделать любые потенциальные проблемы с потоками, условиями гонки и т.д. легче определить.

Ответ 5

Я думаю, что исключение, которое вы получаете, вероятно, является результатом проверки файла атомного метода file.createNewFile(). Метод не может проверить, существует ли файл, потому что некоторые из родительских каталогов не существуют или у вас нет прав доступа к ним. Я бы предложил следующее:

if (file.getParentFile() != null && !file.getParentFile().mkDirs()) {
    // handle permission problems here
}
// either no parent directories there or we have created missing directories
if (file.createNewFile() || file.isFile()) {
    // ready to write your content
} else {
    // handle directory here
}

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

Ответ 6

Вы, безусловно, получаете это исключение "Система не может найти указанный путь"

Просто напечатайте файл file.getAbsoluteFile(), это даст вам знать, какой файл вы хотите создать.

Это исключение произойдет, если каталог, в котором вы создаете файл, не существует.

Ответ 7

Это может быть проблема (проверка и создание вместе не являются атомарными: !file.exists() && !file.createNewFile()), а "файл" уже является каталогом.

Попробуйте (file.isFile()):

if (file.exists() && !file.isFile()){
   //handle directory is there
}else if(!file.createNewFile()) {
   //as before
}

Ответ 8

В моем случае было просто отсутствие разрешения:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Ответ 9

Проблема, с которой я столкнулся, заключается в том, что в имени моего файла содержался символ косой черты "/", поэтому текст перед косой чертой считался каталогом, а не началом имени файла.