Удаляет ли Files.createTempDirectory
каталог после завершения JVM? Или мне нужно вручную рекурсивно удалить содержимое временного каталога?Удаляет ли Files.createTempDirectory каталог после завершения JVM?
ответ
Согласно the API, это не так, вам нужно вручную удалить каталог, используя метод file.deleteOnExit()
.
Как и в методах createTempFile, этот метод является лишь частью временного файла . К устройству может быть удален механизм отключения или механизм File.deleteOnExit(), который автоматически удаляет каталог.
Нет, это не так. Вы должны сделать это самостоятельно. Или используйте java.io.File.deleteOnExit()
, но я думаю, что это не работает для непустых каталогов
Я хотел бы Java больше, если 'new File (Files.createTempDirectory (null) .toString()). DeleteOnExit()' works, hahaha .. – 2013-02-22 10:44:22
Он работает точно так же, как задокументировано - «каталог должен быть пустым, чтобы быть удаленным» - желая удалить непустой каталог является разумным, но не путайте свое желание с «Java не работает». – dimo414
Нет, это не делает - createTempDirectory
Как с
createTempFile
методами, этот метод является лишь частью временного файла объекта. A shutdown-hook, илиFile.deleteOnExit()
механизм может быть использован для автоматического удаления каталога.
Временные каталоги, созданные Files.createTempDirectory()
не удаляются при выходе из системы, если не настроить их, чтобы сделать так:
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()
хранит набор зарегистрированных файлов и удаляет все из них одним крючком завершения. Если вам нужно удалить многие каталоги таким образом, вам нужно реализовать что-то подобное.
Весной существует вспомогательный метод 'org.springframework.util.FileSystemUtils.deleteRecursively (корень файла)' для явного рекурсивного удаления каталога. –
Вы можете добавить 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/
Стоит отметить, что это удаляет каталог, является ли он пустым. –
Как это будет работать? 'new File (Files.createTempDirectory (null) .toString()). deleteOnExit()' – 2013-02-22 10:45:51
@HowardGuo, я так не думаю, вы передаете null для создания метода TempDirectory –
@HowardGuo, http://docs.oracle. com/javase/tutorial/essential/io/dirs.html это должно дать вам больше информации –