Подтвердить что ты не робот

Изменил ли Files.createTempDirectory каталог после завершения JVM?

Удаляет ли Files.createTempDirectory каталог после завершения JVM? Или мне нужно вручную рекурсивно удалить содержимое временного каталога?

4b9b3361

Ответ 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(), но я думаю, что это не работает для непустых каталогов