use owr own shutdown hook to delete temp folders marked as deleteOnExit

This commit is contained in:
Egor.Ushakov
2015-08-25 19:48:57 +03:00
parent 8bd481f989
commit 3f7d533d0a
@@ -32,7 +32,9 @@ import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.UUID;
import java.util.concurrent.ConcurrentLinkedQueue;
/**
* Stripped-down version of {@code com.intellij.openapi.util.io.FileUtil}.
@@ -298,7 +300,9 @@ public class FileUtilRt {
boolean deleteOnExit) throws IOException {
File file = doCreateTempFile(dir, prefix, suffix, true);
if (deleteOnExit) {
file.deleteOnExit();
//file.deleteOnExit();
// default deleteOnExit does not remove dirs if they are not empty
FilesToDeleteHolder.ourFilesToDelete.add(file.getPath());
}
if (!file.isDirectory()) {
throw new IOException("Cannot create directory: " + file);
@@ -306,6 +310,25 @@ public class FileUtilRt {
return file;
}
private static class FilesToDeleteHolder {
public static final Queue<String> ourFilesToDelete = createFilesToDelete();
private static Queue<String> createFilesToDelete() {
final ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();
Runtime.getRuntime().addShutdownHook(new Thread("FileUtil deleteOnExit") {
@Override
public void run() {
String name = queue.poll();
while (name != null) {
delete(new File(name));
name = queue.poll();
}
}
});
return queue;
}
}
@NotNull
public static File createTempFile(@NotNull @NonNls String prefix, @Nullable @NonNls String suffix) throws IOException {
return createTempFile(prefix, suffix, true); // deleteOnExit by default