ti-enxame.com

Files.createTempDirectory remove o diretório depois que a JVM sai normalmente?

Faz Files.createTempDirectory remova o diretório depois que a JVM sai normalmente? Ou preciso remover manualmente recursivamente o conteúdo do diretório temporário?

25
user972946

Conforme a API , não, não é necessário remover manualmente o diretório, usando o método file.deleteOnExit() .

Assim como nos métodos createTempFile, esse método é apenas parte de um recurso de arquivo temporário. Um gancho de desligamento ou o mecanismo File.deleteOnExit () pode ser usado para excluir o diretório automaticamente.

20
Pradeep Simha

Os diretórios temporários criados por Files.createTempDirectory() não são excluídos na saída do sistema, a menos que você os configure para fazer isso:

Um mecanismo shutdown-hook ou File.deleteOnExit() pode ser usado para excluir o diretório automaticamente.

Ou seja, você pode ligar para:

Path tmp = Files.createTempDirectory(null);
tmp.toFile().deleteOnExit();

No entanto, você não pode excluir um diretório a menos que esteja vazio, como documento por File.delete() :

Exclui o arquivo ou diretório indicado por esse nome de caminho abstrato. Se esse nome de caminho indicar um diretório, ele deverá estar vazio para ser excluído.

Portanto, precisamos ficar um pouco mais sofisticados, se você quiser que o diretório e seu conteúdo sejam excluídos. Você pode registrar recursivamente um diretório e seus filhos para exclusão da seguinte forma:

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;
    }
  });
}

Observe, no entanto, que todos os arquivos existentes atualmente existentes são excluídos - se, depois de chamar esse método, você criar novos arquivos, eles e seus diretórios pai não serão excluídos pelo comportamento documentado de File.delete().

Se você deseja excluir um diretório ao sair, independentemente do conteúdo desse diretório, pode usar um gancho de desligamento de maneira quase idêntica:

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);
      }
    }}));
}

Observe, no entanto, que chamar isso repetidamente registra um novo encadeamento de desligamento a cada vez, o que pode causar problemas em escala. File.deleteOnExit() armazena um conjunto de arquivos registrados e exclui todos eles em um gancho de desligamento. Se você precisar excluir muitos diretórios dessa maneira, implemente algo semelhante.

45
dimo414

Você pode adicionar a dependência do Apache commons io ao seu projeto e usar o FileUtils.deleteDirectory () para fazer algo como:

Runtime.getRuntime().addShutdownHook(new Thread() {
    @Override
    public void run() {
        try {
            FileUtils.deleteDirectory(tmp_dir_path.toFile());
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
});

Para obter mais informações sobre o Apache commons, verifique: https://commons.Apache.org/proper/commons-io/

14
Yahya

Não, não - createTempDirectory

Como nos métodos createTempFile, esse método é apenas parte de um recurso de arquivo temporário. Um mecanismo shutdown-hook ou File.deleteOnExit() pode ser usado para excluir o diretório automaticamente.

2
Nishant Shreshth

Não, não faz. Você tem que fazer isso sozinho. Ou use Java.io.File.deleteOnExit(), mas acho que não funciona para diretórios não vazios

1
Adam Dyga