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();
Чтобы найти правильный путь во время выполнения, чтобы при передаче программы на другой компьютер он все равно найдет файл.
Ответы
Ответ 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()
работал нормально.