import std.conv; import std.digest.crc; import std.file; import std.path; import std.regex; import std.socket; import std.stdio; import std.string; private string deviceName; static this() { deviceName = Socket.hostName; } // give a new name to the specified file or directory void safeRename(const(char)[] path) { auto ext = extension(path); auto newPath = path.chomp(ext) ~ "-" ~ deviceName; if (exists(newPath ~ ext)) { int n = 2; char[] newPath2; do { newPath2 = newPath ~ "-" ~ n.to!string; n++; } while (exists(newPath2 ~ ext)); newPath = newPath2; } newPath ~= ext; rename(path, newPath); } // return the crc32 hex string of a file string computeCrc32(string path) { CRC32 crc; auto file = File(path, "rb"); foreach (ubyte[] data; chunks(file, 4096)) { crc.put(data); } return crc.finish().toHexString().dup; } // convert wildcards (*, ?) to regex Regex!char wild2regex(const(char)[] pattern) { string str; str.reserve(pattern.length + 2); str ~= "/"; foreach (c; pattern) { switch (c) { case '*': str ~= "[^/]*"; break; case '.': str ~= "\\."; break; case '?': str ~= "[^/]"; break; case '|': str ~= "$|/"; break; default: str ~= c; break; } } str ~= "$"; return regex(str, "i"); } // return true if the network connection is available bool testNetwork() { try { auto addr = new InternetAddress("login.live.com", 443); auto socket = new TcpSocket(addr); return socket.isAlive(); } catch (SocketException) { return false; } }