package org.embulk.spi; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.FileVisitResult; import java.io.File; import java.io.IOException; import com.google.common.base.Preconditions; public class TempFileSpace { private final File dir; private boolean dirCreated; public TempFileSpace(File dir) { Preconditions.checkArgument(dir != null, "dir is null"); this.dir = dir; } public File createTempFile() { return createTempFile("tmp"); } public File createTempFile(String fileExt) { // Thread names contain ':' which is not valid as file names in Windows. return createTempFile(Thread.currentThread().getName().replaceAll(":", "_") + "_", fileExt); } public File createTempFile(String prefix, String fileExt) { try { if (!dirCreated) { dir.mkdirs(); dirCreated = true; } return File.createTempFile(prefix, "."+fileExt, dir); } catch (IOException ex) { throw new TempFileException(ex); } } public void cleanup() { try { deleteFilesIfExistsRecursively(dir); } catch (IOException ex) { // ignore IOException } dirCreated = false; } private void deleteFilesIfExistsRecursively(File dir) throws IOException { Files.walkFileTree(dir.toPath(), new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { try { Files.deleteIfExists(file); } catch (IOException ex) { // ignore IOException } return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) { try { Files.deleteIfExists(dir); } catch (IOException ex) { // ignore IOException } return FileVisitResult.CONTINUE; } }); } }