Java 'file.delete ()' не удаляет указанный файл - PullRequest
36 голосов
/ 20 декабря 2010

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

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

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

Ответы [ 11 ]

53 голосов
/ 17 декабря 2013

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

31 голосов
/ 20 декабря 2010

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

Этот код:

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

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

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

11 голосов
/ 12 июля 2012

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

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

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 голосов
/ 12 августа 2016

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

3 голосов
/ 17 августа 2018

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

1 голос
/ 20 августа 2015

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

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

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

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

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

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

0 голосов
/ 07 мая 2019

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

0 голосов
/ 04 октября 2018

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

0 голосов
/ 18 октября 2017

Я сделал ошибку, открыв 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;, и f.delete() работал нормально.

...