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; }