https://howtodoinjava.com/java/io/how-to-delete-teilitary-file-in-java/
здесь у вас есть хороший учебник. Убедитесь, что вы вызываете
File.deleteOnExit();
Запросы на удаление файла или каталога, обозначенного этим абстрактным путем, после завершения работы виртуальной машины
blockquote>См. https. : //docs.oracle.com/javase/8/docs/api/java/io/File.html#deleteOnExit--
Вы должны проверить Apache commons-io . У него есть класс FileUtils , который будет делать то, что вы хотите.
FileUtils.deleteDirectory(new File("directory"));
Может быть, решение этой проблемы может быть переопределить метод delete класса File, используя код из ответа Эриксона:
public class MyFile extends File {
... <- copy constructor
public boolean delete() {
if (f.isDirectory()) {
for (File c : f.listFiles()) {
return new MyFile(c).delete();
}
} else {
return f.delete();
}
}
}
Вот простой метод main, который принимает аргумент командной строки, вам может понадобиться добавить собственную проверку ошибок или настроить ее так, как вы считаете нужным.
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
public class DeleteFiles {
/**
* @param intitial arguments take in a source to read from and a
* destination to read to
*/
public static void main(String[] args)
throws FileNotFoundException,IOException {
File src = new File(args[0]);
if (!src.exists() ) {
System.out.println("FAILURE!");
}else{
// Gathers files in directory
File[] a = src.listFiles();
for (int i = 0; i < a.length; i++) {
//Sends files to recursive deletion method
fileDelete(a[i]);
}
// Deletes original source folder
src.delete();
System.out.println("Success!");
}
}
/**
* @param srcFile Source file to examine
* @throws FileNotFoundException if File not found
* @throws IOException if File not found
*/
private static void fileDelete(File srcFile)
throws FileNotFoundException, IOException {
// Checks if file is a directory
if (srcFile.isDirectory()) {
//Gathers files in directory
File[] b = srcFile.listFiles();
for (int i = 0; i < b.length; i++) {
//Recursively deletes all files and sub-directories
fileDelete(b[i]);
}
// Deletes original sub-directory file
srcFile.delete();
} else {
srcFile.delete();
}
}
}
Надеюсь, это поможет!
С Java 7 мы наконец можем сделать это с надежным обнаружением символической ссылки. (Я не считаю, что Apache commons-io в настоящее время имеет надежное обнаружение символических ссылок , поскольку он не обрабатывает ссылки в Windows, созданные с помощью mklink
.)
Для ради истории, вот ответ до Java 7, который следует за символическими ссылками.
void delete(File f) throws IOException {
if (f.isDirectory()) {
for (File c : f.listFiles())
delete(c);
}
if (!f.delete())
throw new FileNotFoundException("Failed to delete file: " + f);
}
rm -rf
был очень более производительны, чем FileUtils.deleteDirectory
. После обширного сравнительного тестирования, мы нашли, что использование rm -rf
было многократно быстрее, чем использование FileUtils.deleteDirectory
.
, Конечно, если у Вас есть маленький или простой каталог, он не будет иметь значения, но в нашем случае мы имели несколько гигабайтов и глубоко вложили подкаталоги, где он примет 10 минут с FileUtils.deleteDirectory
и только 1 минуту с rm -rf
.
Вот наша грубая реализация Java, чтобы сделать это:
// Delete directory given and all subdirectories and files (i.e. recursively).
//
static public boolean deleteDirectory( File file ) throws IOException, InterruptedException {
if ( file.exists() ) {
String deleteCommand = "rm -rf " + file.getAbsolutePath();
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec( deleteCommand );
process.waitFor();
return true;
}
return false;
}
Стоящий попытки, если Вы имеете дело с большими или сложными каталогами.
Guava имел Files.deleteRecursively (File)
, поддерживаемый до Guava 9 .
Из Guava 10 :
Не рекомендуется. Этот метод страдает плохим обнаружением символических ссылок и условиями гонки. Эта функциональность может поддерживаться надлежащим образом только с помощью командного интерпретатора операционной системы, такой как
rm -rf
илиdel / s
. Этот метод планируется удалить из Guava в выпуске Guava 11.0.
Следовательно, в Guava 11 такого метода нет.