Java 'file.delete ()' не удаляет указанный файл

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

UserInput.prompt("Enter name of file to delete");
String name = UserInput.readString();
File file = new File("\\Files\\" + name + ".txt");
file.delete();

Любая помощь будет очень признательна!

Теперь у меня есть:

File file = new File(catName + ".txt");
String path = file.getCanonicalPath();
File filePath = new File(path);
filePath.delete();

Чтобы попытаться найти правильный путь во время выполнения, чтобы при переносе программы на другой компьютер она все равно нашла файл.


person Kimberley Lloyd    schedule 19.12.2010    source источник
comment
вы проверили права доступа к файлам и папкам?   -  person lock    schedule 20.12.2010
comment
Какая среда: Unix или Windows?   -  person rkg    schedule 20.12.2010
comment
Выбрасываются ли какие-либо исключения? Каково возвращаемое значение вызова file.delete()?   -  person Brad Mace    schedule 20.12.2010
comment
Что за \\Files\` for? And do you really mean to append .txt`?   -  person moinudin    schedule 20.12.2010
comment
Также не забудьте закрыть все возможные программы, в которых может быть открыт файл. Я пытался удалить базу данных, пока она была открыта в браузере базы данных.   -  person Will Nasby    schedule 31.08.2015
comment
Если это под Windows, это потому, что файл открыт (или mmap'd). Windows блокирует открытые файлы, а затем File :: delete не может их удалить.   -  person Luke Hutchison    schedule 07.05.2019


Ответы (12)


Обязательно найдите свой текущий рабочий каталог и укажите путь к нему относительно него.

Этот код:

File here = new File(".");
System.out.println(here.getAbsolutePath());

... распечатает этот каталог.

Кроме того, независимо от вашего вопроса, попробуйте использовать File.separator, чтобы оставаться независимыми от ОС. Обратные косые черты работают только в Windows.

person Goran Jovic    schedule 19.12.2010
comment
И вопреки распространенному мнению, косая черта действительно работает в Windows. Только не ожидайте, что Windows вернет пути с косой чертой. - person meustrus; 05.09.2018

Проблема также может быть связана с любыми выходными потоками, которые вы забыли закрыть. В моем случае я работал с файлом до того, как файл был удален. Однако в одном месте файловых операций я забыл закрыть выходной поток, который я использовал для записи в файл, который позже пытались удалить.

person user2926391    schedule 16.12.2013
comment
Та же концепция, но я обнаружил, что мне нужно закрыть потоки input. - person R.D. Alkire; 29.01.2016
comment
Он работает после закрытия FileInputStream / FileOutputStream. большое спасибо. - person deadend; 27.06.2017
comment
Это было последнее, о чем я мог подумать, но вы правы ... Правильное закрытие файла (а не только сброс) решает проблему. - person Al-Punk; 23.08.2019

У меня та же проблема! потом понял, что моя директория не пуста. Я нашел решение в другом потоке: невозможно удалить каталог через Java

/**
 * Force deletion of directory
 * @param path
 * @return
 */
static public boolean deleteDirectory(File path) {
    if (path.exists()) {
        File[] files = path.listFiles();
        for (int i = 0; i < files.length; i++) {
            if (files[i].isDirectory()) {
                deleteDirectory(files[i]);
            } else {
                files[i].delete();
            }
        }
    }
    return (path.delete());
}
person Maha    schedule 12.07.2012

Попробуйте закрыть все FileOutputStream/FileInputStream, которые вы открыли ранее другими методами, а затем попробуйте удалить, работает как шарм.

person ABHISHEK BHARDWAJ    schedule 17.08.2018

Подозреваю, что проблема в том, что путь неверный. Попробуй это:

UserInput.prompt("Enter name of file to delete");
String name = UserInput.readString();
File file = new File("\\Files\\" + name + ".txt");
if (file.exists()) {
    file.delete();
} else {
    System.err.println(
        "I cannot find '" + file + "' ('" + file.getAbsolutePath() + "')");
}
person Stephen C    schedule 19.12.2010

Если вы хотите удалить файл, сначала закройте все соединения и потоки. после этого удалите файл.

person Anurag Mishra    schedule 12.08.2016

В моем случае это была close (), которая не выполнялась из-за необработанного исключения.

void method() throws Exception {
    FileInputStream fis = new FileInputStream(fileName);
    parse(fis);
    fis.close();
}

Предположим, что исключение выбрасывается в parse (), которое не обрабатывается в этом методе, и поэтому файл не закрывается, в дальнейшем файл удаляется, и этот оператор удаления завершается с ошибкой, и не удаляйте.

Итак, вместо этого у меня был такой код, и он сработал ...

    try {
        parse(fis);
    }
    catch (Exception ex) {
        fis.close();
        throw ex;
    }

так базовая Java, которую иногда упускают из виду.

person Abdul Ahad    schedule 20.08.2015

Как показывают другие ответы, в Windows вы не можете удалить открытый файл. Однако еще одна вещь, которая может помешать удалению файла в Windows, - это то, что он mmap'd на MappedByteBuffer (или DirectByteBuffer) - в этом случае файл не может быть удален до тех пор, пока байтовый буфер не будет собран сборщиком мусора. Здесь есть относительно безопасный код для принудительного закрытия (очистки) DirectByteBuffer перед сборкой мусора: https://github.com/classgraph/classgraph/blob/master/src/main/java/nonapi/io/github/classgraph/utils/FileUtils.java#L606 После очистки ByteBuffer вы можете удалить файл. Однако убедитесь, что вы никогда не используете ByteBuffer снова после его очистки, иначе JVM выйдет из строя.

person Luke Hutchison    schedule 06.05.2019

Я сделал ошибку, открыв BufferedReader, например:

File f = new File("somefile.txt");
BufferedReader br = new BufferedReader(new FileReader(f));

... и, конечно, я не мог выполнить f.delete(), потому что я обернул FileReader вместо того, чтобы создавать его собственную переменную, где я мог бы явно закрыть ее. Ах ...

Однажды я закодировал:

File f = new File("somefile.txt");
FileReader fread = new FileReader(f);
BufferedReader br = new BufferedReader(fread);

Я мог выдать br.close(); br=null; fread.close(); fread=null;, и f.delete() работал нормально.

person NoteBender    schedule 18.10.2017

В моем случае я обрабатывал набор файлов jar, содержащихся в каталоге. После того, как я их обработал, я попытался удалить их из этого каталога, но они не удалялись. Я использовал JarFile для их обработки, и проблема заключалась в том, что я забыл закрыть JarFile, когда закончил.

person Tom Rutchik    schedule 03.10.2018

Поскольку каталог не пуст, file.delete () всегда возвращает false.

я использовал

file.deleteRecursively ()

который доступен в Kotlin и удалит полностью напрямую и вернет логический ответ, как это делает file.delete ().

person Damanpreet Singh    schedule 10.09.2020
comment
Это вопрос Java, и решение не работает для Java. - person Stephen C; 01.06.2021

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

System.gc();
if(new File("./__tmp.txt").delete()){
    System.out.println("OK");
}

Не забудьте закрыть этот файл, если предыдущее открытие с использованием фрагмента кода fio.close(), которое я тестировал в Java 1.8, работает хорошо.

person Prashant    schedule 17.10.2019