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

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();

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

4b9b3361

Ответ 1

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

Этот код:

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

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

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

Ответ 2

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

Ответ 3

У меня такая же проблема! затем понял, что мой каталог не пуст. Я нашел решение в другом потоке: не удалось удалить каталог через 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());
}

Ответ 4

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

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() + "')");
}

Ответ 5

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

Ответ 6

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

Ответ 7

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

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, которую мы иногда пропускаем.

Ответ 8

Как показывают другие ответы, в 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 ByteBuffer крах.

Ответ 9

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

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

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

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

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

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

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

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