Удаляет ли Files.createTempDirectory
каталог после завершения JVM? Или мне нужно вручную рекурсивно удалить содержимое временного каталога?
Изменил ли Files.createTempDirectory каталог после завершения JVM?
Ответ 1
По API, нет, это не так, вам нужно вручную удалить каталог, используя file.deleteOnExit()
.
Как и в методах createTempFile, этот метод является лишь частью временного файла объект. Выключатель остановки или механизм File.deleteOnExit() могут использоваться для автоматически удалите каталог.
Ответ 2
Временные каталоги, созданные Files.createTempDirectory()
, не удаляются при выходе из системы, если вы не настроили их для этого:
A shutdown-hook или
File.deleteOnExit()
может использоваться для автоматического удаления каталога.
Значение, которое вы могли бы назвать:
Path tmp = Files.createTempDirectory(null);
tmp.toFile().deleteOnExit();
Однако вы не можете удалить каталог, если он не пуст, как документ File.delete()
:
Удаляет файл или каталог, обозначенные этим абстрактным именем пути. Если это имя пути обозначает каталог, тогда каталог должен быть пустым в для удаления.
Итак, нам нужно немного поучаствовать, если вы хотите удалить каталог и его содержимое. Вы можете рекурсивно зарегистрировать каталог и его дочерние элементы для удаления так:
public static void recursiveDeleteOnExit(Path path) throws IOException {
Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file,
@SuppressWarnings("unused") BasicFileAttributes attrs) {
file.toFile().deleteOnExit();
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory(Path dir,
@SuppressWarnings("unused") BasicFileAttributes attrs) {
dir.toFile().deleteOnExit();
return FileVisitResult.CONTINUE;
}
});
}
Обратите внимание, что это регистрирует все существующие файлы для удаления - если после вызова этого метода вы создаете новые файлы, они и их родительские каталоги не будут удалены по документированному поведению File.delete()
.
Если вы хотите удалить каталог после выхода, независимо от содержимого указанной директории, вы можете использовать выключение с крючком почти одинаковым образом:
public static void recursiveDeleteOnShutdownHook(final Path path) {
Runtime.getRuntime().addShutdownHook(new Thread(
new Runnable() {
@Override
public void run() {
try {
Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file,
@SuppressWarnings("unused") BasicFileAttributes attrs)
throws IOException {
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException e)
throws IOException {
if (e == null) {
Files.delete(dir);
return FileVisitResult.CONTINUE;
}
// directory iteration failed
throw e;
}
});
} catch (IOException e) {
throw new RuntimeException("Failed to delete "+path, e);
}
}}));
}
Обратите внимание, что при вызове этого параметра каждый раз каждый раз регистрируется новый поток выключения, что может вызвать проблемы в масштабе. File.deleteOnExit()
хранит набор зарегистрированных файлов и удаляет все из них одним крючком завершения. Если вам нужно удалить многие каталоги таким образом, вам нужно реализовать что-то подобное.
Ответ 3
Вы можете добавить зависимость от apache commons io от своего проекта, а затем использовать FileUtils.deleteDirectory(), чтобы сделать что-то вроде:
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
try {
FileUtils.deleteDirectory(tmp_dir_path.toFile());
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
Для получения дополнительной информации об apache commons проверьте: https://commons.apache.org/proper/commons-io/
Ответ 4
Нет, это не так - createTempDirectory
Как и в методах
createTempFile
, этот метод является лишь частью временный файл. A shutdown-hook илиFile.deleteOnExit()
механизм может быть использован для автоматического удаления каталога.
Ответ 5
Нет, это не так. Вы должны сделать это самостоятельно. Или используйте java.io.File.deleteOnExit()
, но я думаю, что это не работает для непустых каталогов