38

Files.createTempDirectoryJVMが正常に終了した後、ディレクトリを削除しますか?または、一時ディレクトリのコンテンツを手動で再帰的に削除する必要がありますか?

4

5 に答える 5

57

によって作成された一時ディレクトリは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()登録されたファイルのセットを保存し、それらすべてを 1 つのシャットダウン フックで削除します。この方法で多くのディレクトリを削除する必要がある場合は、同様のものを実装する必要があります。

于 2013-11-29T08:06:22.167 に答える
29

APIによると、そうではありませんfile.deleteOnExit()。メソッドを使用して、ディレクトリを手動で削除する必要があります。

createTempFile メソッドと同様に、このメソッドは一時ファイル機能の一部にすぎません。シャットダウンフックまたは File.deleteOnExit() メカニズムを使用して、ディレクトリを自動的に削除できます。

于 2013-02-22T10:44:52.410 に答える
23

プロジェクトに 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/ を参照してください。

于 2016-05-21T22:56:55.843 に答える
2

いいえ、そうではありません -createTempDirectory

メソッドと同様にcreateTempFile、このメソッドは一時ファイル機能の一部にすぎません。shutdown-hook、またはメカニズムFile.deleteOnExit() を使用して、ディレクトリを自動的に削除できます。

于 2013-02-22T10:47:58.950 に答える
1

いいえ、そうではありません。あなたは自分でそれをしなければなりません。または使用しますjava.io.File.deleteOnExit()が、空でないディレクトリでは機能しないと思います

于 2013-02-22T10:42:00.057 に答える