1 module caLib_util.tempdir;
2 
3 import std.file : tempDir, mkdirRecurse, rmdirRecurse, exists, dirEntries, SpanMode, FileException;
4 import std.random : uniform;
5 import std.conv : to;
6 import std.path : absolutePath;
7 import std.exception : enforce;
8 
9 
10 private immutable string tempDirsRoot;
11 
12 shared static this()
13 {
14 	if(tempDir() == ".")
15 		tempDirsRoot = makeTempDirsRoot();
16 	else
17 		tempDirsRoot = tempDir();
18 
19 	removeTempFiles();
20 }
21 
22 shared static ~this()
23 {
24 	removeTempFiles();
25 }
26 
27 
28 
29 string makePrivateTempDir() { return makePrivateTempDir(0); }
30 
31 string makePrivateTempDir(int n)
32 {
33 	enforce(n < 1000,
34 		"Could not create a temporary directory");
35 
36 	string dir = tempDirsRoot ~ "caLib3_" ~ to!string(uniform(1000, 9999));
37 
38 	if(exists(dir))
39 		return makePrivateTempDir();
40 
41 	mkdirRecurse(dir);
42 	return dir;
43 }
44 
45 
46 
47 private void removeTempFiles()
48 {
49 	if(!exists(tempDirsRoot))
50 		return;
51 	
52 	auto dirs = dirEntries(tempDirsRoot, SpanMode.shallow);
53 	
54 	foreach(dirPath ; dirs)
55 	{
56 		string dirName = dirPath[tempDirsRoot.length .. dirPath.length];
57 		if(dirName.length >= 7 && dirName[0 .. 7] == "caLib3_")
58 			rmdirRecurse(dirPath);
59 	}
60 }
61 
62 
63 
64 private string makeTempDirsRoot() { return null; }