2013-02-22 3 views

ответ

12

Согласно the API, это не так, вам нужно вручную удалить каталог, используя метод file.deleteOnExit().

Как и в методах createTempFile, этот метод является лишь частью временного файла . К устройству может быть удален механизм отключения или механизм File.deleteOnExit(), который автоматически удаляет каталог.

+0

Как это будет работать? 'new File (Files.createTempDirectory (null) .toString()). deleteOnExit()' – 2013-02-22 10:45:51

+2

@HowardGuo, я так не думаю, вы передаете null для создания метода TempDirectory –

+1

@HowardGuo, http://docs.oracle. com/javase/tutorial/essential/io/dirs.html это должно дать вам больше информации –

1

Нет, это не так. Вы должны сделать это самостоятельно. Или используйте java.io.File.deleteOnExit(), но я думаю, что это не работает для непустых каталогов

+1

Я хотел бы Java больше, если 'new File (Files.createTempDirectory (null) .toString()). DeleteOnExit()' works, hahaha .. – 2013-02-22 10:44:22

+2

Он работает точно так же, как задокументировано - «каталог должен быть пустым, чтобы быть удаленным» - желая удалить непустой каталог является разумным, но не путайте свое желание с «Java не работает». – dimo414

2

Нет, это не делает - createTempDirectory

Как с createTempFile методами, этот метод является лишь частью временного файла объекта. A shutdown-hook, или File.deleteOnExit() механизм может быть использован для автоматического удаления каталога.

32

Временные каталоги, созданные 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() хранит набор зарегистрированных файлов и удаляет все из них одним крючком завершения. Если вам нужно удалить многие каталоги таким образом, вам нужно реализовать что-то подобное.

+2

Весной существует вспомогательный метод 'org.springframework.util.FileSystemUtils.deleteRecursively (корень файла)' для явного рекурсивного удаления каталога. –

8

Вы можете добавить 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/

+1

Стоит отметить, что это удаляет каталог, является ли он пустым. –