| @safe unittest | |
| { | |
| import std.file; | |
| import std.exception : assertThrown; | |
| assertThrown!FileException("non.existing.file.".readText); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.utf : byChar; | |
| scope(exit) | |
| { | |
| assert(exists(deleteme)); | |
| remove(deleteme); | |
| } | |
| std.file.write(deleteme, "1234"); // deleteme is the name of a temporary file | |
| assert(read(deleteme, 2) == "12"); | |
| assert(read(deleteme.byChar) == "1234"); | |
| assert((cast(const(ubyte)[])read(deleteme)).length == 4); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| write(deleteme, "abc"); // deleteme is the name of a temporary file | |
| scope(exit) remove(deleteme); | |
| string content = readText(deleteme); | |
| assert(content == "abc"); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| scope(exit) | |
| { | |
| assert(exists(deleteme)); | |
| remove(deleteme); | |
| } | |
| int[] a = [ 0, 1, 1, 2, 3, 5, 8 ]; | |
| write(deleteme, a); // deleteme is the name of a temporary file | |
| const bytes = read(deleteme); | |
| const fileInts = () @trusted { return cast(int[]) bytes; }(); | |
| assert(fileInts == a); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| scope(exit) | |
| { | |
| assert(exists(deleteme)); | |
| remove(deleteme); | |
| } | |
| int[] a = [ 0, 1, 1, 2, 3, 5, 8 ]; | |
| write(deleteme, a); // deleteme is the name of a temporary file | |
| int[] b = [ 13, 21 ]; | |
| append(deleteme, b); | |
| const bytes = read(deleteme); | |
| const fileInts = () @trusted { return cast(int[]) bytes; }(); | |
| assert(fileInts == a ~ b); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| auto t1 = deleteme, t2 = deleteme~"2"; | |
| scope(exit) foreach (t; [t1, t2]) if (t.exists) t.remove(); | |
| t1.write("1"); | |
| t1.rename(t2); | |
| assert(t2.readText == "1"); | |
| t1.write("2"); | |
| t1.rename(t2); | |
| assert(t2.readText == "2"); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.exception : assertThrown; | |
| deleteme.write("Hello"); | |
| assert(deleteme.readText == "Hello"); | |
| deleteme.remove; | |
| assertThrown!FileException(deleteme.readText); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| scope(exit) deleteme.remove; | |
| // create a file of size 1 | |
| write(deleteme, "a"); | |
| assert(getSize(deleteme) == 1); | |
| // create a file of size 3 | |
| write(deleteme, "abc"); | |
| assert(getSize(deleteme) == 3); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.datetime : abs, SysTime; | |
| scope(exit) deleteme.remove; | |
| write(deleteme, "a"); | |
| SysTime accessTime, modificationTime; | |
| getTimes(deleteme, accessTime, modificationTime); | |
| import std.datetime : Clock, seconds; | |
| auto currTime = Clock.currTime(); | |
| enum leeway = 5.seconds; | |
| auto diffAccess = accessTime - currTime; | |
| auto diffModification = modificationTime - currTime; | |
| assert(abs(diffAccess) <= leeway); | |
| assert(abs(diffModification) <= leeway); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.datetime : DateTime, hnsecs, SysTime; | |
| scope(exit) deleteme.remove; | |
| write(deleteme, "a"); | |
| SysTime accessTime = SysTime(DateTime(2010, 10, 4, 0, 0, 30)); | |
| SysTime modificationTime = SysTime(DateTime(2018, 10, 4, 0, 0, 30)); | |
| setTimes(deleteme, accessTime, modificationTime); | |
| SysTime accessTimeResolved, modificationTimeResolved; | |
| getTimes(deleteme, accessTimeResolved, modificationTimeResolved); | |
| assert(accessTime == accessTimeResolved); | |
| assert(modificationTime == modificationTimeResolved); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.datetime : abs, DateTime, hnsecs, SysTime; | |
| scope(exit) deleteme.remove; | |
| import std.datetime : Clock, seconds; | |
| auto currTime = Clock.currTime(); | |
| enum leeway = 5.seconds; | |
| deleteme.write("bb"); | |
| assert(abs(deleteme.timeLastModified - currTime) <= leeway); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.datetime : SysTime; | |
| assert("file.does.not.exist".timeLastModified(SysTime.min) == SysTime.min); | |
| auto source = deleteme ~ "source"; | |
| auto target = deleteme ~ "target"; | |
| scope(exit) source.remove, target.remove; | |
| source.write("."); | |
| assert(target.timeLastModified(SysTime.min) < source.timeLastModified); | |
| target.write("."); | |
| assert(target.timeLastModified(SysTime.min) >= source.timeLastModified); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| auto f = deleteme ~ "does.not.exist"; | |
| assert(!f.exists); | |
| f.write("hello"); | |
| assert(f.exists); | |
| f.remove; | |
| assert(!f.exists); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| assert(".".exists); | |
| assert(!"this file does not exist".exists); | |
| deleteme.write("a\n"); | |
| scope(exit) deleteme.remove; | |
| assert(deleteme.exists); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.exception : assertThrown; | |
| auto f = deleteme ~ "file"; | |
| scope(exit) f.remove; | |
| assert(!f.exists); | |
| assertThrown!FileException(f.getAttributes); | |
| f.write("."); | |
| auto attributes = f.getAttributes; | |
| assert(!attributes.attrIsDir); | |
| assert(attributes.attrIsFile); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.exception : assertThrown; | |
| auto dir = deleteme ~ "dir"; | |
| scope(exit) dir.rmdir; | |
| assert(!dir.exists); | |
| assertThrown!FileException(dir.getAttributes); | |
| dir.mkdir; | |
| auto attributes = dir.getAttributes; | |
| assert(attributes.attrIsDir); | |
| assert(!attributes.attrIsFile); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.exception : assertThrown; | |
| auto source = deleteme ~ "source"; | |
| auto target = deleteme ~ "target"; | |
| assert(!source.exists); | |
| assertThrown!FileException(source.getLinkAttributes); | |
| // symlinking isn't available on Windows | |
| version (Posix) | |
| { | |
| scope(exit) source.remove, target.remove; | |
| target.write("target"); | |
| target.symlink(source); | |
| assert(source.readText == "target"); | |
| assert(source.isSymlink); | |
| assert(source.getLinkAttributes.attrIsSymlink); | |
| } | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.exception : assertThrown; | |
| auto f = deleteme ~ "file"; | |
| scope(exit) f.remove; | |
| assert(!f.exists); | |
| assertThrown!FileException(f.getLinkAttributes); | |
| f.write("."); | |
| auto attributes = f.getLinkAttributes; | |
| assert(!attributes.attrIsDir); | |
| assert(attributes.attrIsFile); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.exception : assertThrown; | |
| auto dir = deleteme ~ "dir"; | |
| scope(exit) dir.rmdir; | |
| assert(!dir.exists); | |
| assertThrown!FileException(dir.getLinkAttributes); | |
| dir.mkdir; | |
| auto attributes = dir.getLinkAttributes; | |
| assert(attributes.attrIsDir); | |
| assert(!attributes.attrIsFile); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.exception : assertThrown; | |
| import std.conv : octal; | |
| auto f = deleteme ~ "file"; | |
| version (Posix) | |
| { | |
| scope(exit) f.remove; | |
| assert(!f.exists); | |
| assertThrown!FileException(f.setAttributes(octal!777)); | |
| f.write("."); | |
| auto attributes = f.getAttributes; | |
| assert(!attributes.attrIsDir); | |
| assert(attributes.attrIsFile); | |
| f.setAttributes(octal!777); | |
| attributes = f.getAttributes; | |
| assert((attributes & 1023) == octal!777); | |
| } | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.exception : assertThrown; | |
| import std.conv : octal; | |
| auto dir = deleteme ~ "dir"; | |
| version (Posix) | |
| { | |
| scope(exit) dir.rmdir; | |
| assert(!dir.exists); | |
| assertThrown!FileException(dir.setAttributes(octal!777)); | |
| dir.mkdir; | |
| auto attributes = dir.getAttributes; | |
| assert(attributes.attrIsDir); | |
| assert(!attributes.attrIsFile); | |
| dir.setAttributes(octal!777); | |
| attributes = dir.getAttributes; | |
| assert((attributes & 1023) == octal!777); | |
| } | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.exception : assertThrown; | |
| auto dir = deleteme ~ "dir"; | |
| auto f = deleteme ~ "f"; | |
| scope(exit) dir.rmdir, f.remove; | |
| assert(!dir.exists); | |
| assertThrown!FileException(dir.isDir); | |
| dir.mkdir; | |
| assert(dir.isDir); | |
| f.write("."); | |
| assert(!f.isDir); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.exception : assertThrown; | |
| auto dir = deleteme ~ "dir"; | |
| auto f = deleteme ~ "f"; | |
| scope(exit) dir.rmdir, f.remove; | |
| assert(!dir.exists); | |
| assertThrown!FileException(dir.getAttributes.attrIsDir); | |
| dir.mkdir; | |
| assert(dir.isDir); | |
| assert(dir.getAttributes.attrIsDir); | |
| f.write("."); | |
| assert(!f.isDir); | |
| assert(!f.getAttributes.attrIsDir); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.exception : assertThrown; | |
| auto dir = deleteme ~ "dir"; | |
| auto f = deleteme ~ "f"; | |
| scope(exit) dir.rmdir, f.remove; | |
| dir.mkdir; | |
| assert(!dir.isFile); | |
| assert(!f.exists); | |
| assertThrown!FileException(f.isFile); | |
| f.write("."); | |
| assert(f.isFile); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.exception : assertThrown; | |
| auto dir = deleteme ~ "dir"; | |
| auto f = deleteme ~ "f"; | |
| scope(exit) dir.rmdir, f.remove; | |
| dir.mkdir; | |
| assert(!dir.isFile); | |
| assert(!dir.getAttributes.attrIsFile); | |
| assert(!f.exists); | |
| assertThrown!FileException(f.getAttributes.attrIsFile); | |
| f.write("."); | |
| assert(f.isFile); | |
| assert(f.getAttributes.attrIsFile); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.exception : assertThrown; | |
| auto source = deleteme ~ "source"; | |
| auto target = deleteme ~ "target"; | |
| assert(!source.exists); | |
| assertThrown!FileException(source.isSymlink); | |
| // symlinking isn't available on Windows | |
| version (Posix) | |
| { | |
| scope(exit) source.remove, target.remove; | |
| target.write("target"); | |
| target.symlink(source); | |
| assert(source.readText == "target"); | |
| assert(source.isSymlink); | |
| assert(source.getLinkAttributes.attrIsSymlink); | |
| } | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.exception : assertThrown; | |
| auto source = deleteme ~ "source"; | |
| auto target = deleteme ~ "target"; | |
| assert(!source.exists); | |
| assertThrown!FileException(source.getLinkAttributes.attrIsSymlink); | |
| // symlinking isn't available on Windows | |
| version (Posix) | |
| { | |
| scope(exit) source.remove, target.remove; | |
| target.write("target"); | |
| target.symlink(source); | |
| assert(source.readText == "target"); | |
| assert(source.isSymlink); | |
| assert(source.getLinkAttributes.attrIsSymlink); | |
| } | |
| } | |
| @system unittest | |
| { | |
| import std.file; | |
| import std.algorithm.comparison : equal; | |
| import std.algorithm.sorting : sort; | |
| import std.array : array; | |
| import std.path : buildPath; | |
| auto cwd = getcwd; | |
| auto dir = deleteme ~ "dir"; | |
| dir.mkdir; | |
| scope(exit) cwd.chdir, dir.rmdirRecurse; | |
| dir.buildPath("a").write("."); | |
| dir.chdir; // step into dir | |
| "b".write("."); | |
| assert(dirEntries(".", SpanMode.shallow).array.sort.equal( | |
| [".".buildPath("a"), ".".buildPath("b")] | |
| )); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.file : mkdir; | |
| auto dir = deleteme ~ "dir"; | |
| scope(exit) dir.rmdir; | |
| dir.mkdir; | |
| assert(dir.exists); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.exception : assertThrown; | |
| assertThrown("a/b/c/d/e".mkdir); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.path : buildPath; | |
| auto dir = deleteme ~ "dir"; | |
| scope(exit) dir.rmdirRecurse; | |
| dir.mkdir; | |
| assert(dir.exists); | |
| dir.mkdirRecurse; // does nothing | |
| // creates all parent directories as needed | |
| auto nested = dir.buildPath("a", "b", "c"); | |
| nested.mkdirRecurse; | |
| assert(nested.exists); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.exception : assertThrown; | |
| scope(exit) deleteme.remove; | |
| deleteme.write("a"); | |
| // cannot make directory as it's already a file | |
| assertThrown!FileException(deleteme.mkdirRecurse); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| auto dir = deleteme ~ "dir"; | |
| dir.mkdir; | |
| assert(dir.exists); | |
| dir.rmdir; | |
| assert(!dir.exists); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| auto s = getcwd(); | |
| assert(s.length); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.path : isAbsolute; | |
| auto path = thisExePath(); | |
| assert(path.exists); | |
| assert(path.isAbsolute); | |
| assert(path.isFile); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| auto source = deleteme ~ "source"; | |
| auto target = deleteme ~ "target"; | |
| auto targetNonExistent = deleteme ~ "target2"; | |
| scope(exit) source.remove, target.remove, targetNonExistent.remove; | |
| source.write("source"); | |
| target.write("target"); | |
| assert(target.readText == "target"); | |
| source.copy(target); | |
| assert(target.readText == "source"); | |
| source.copy(targetNonExistent); | |
| assert(targetNonExistent.readText == "source"); | |
| } | |
| @system unittest | |
| { | |
| import std.file; | |
| import std.path : buildPath; | |
| auto dir = deleteme.buildPath("a", "b", "c"); | |
| dir.mkdirRecurse; | |
| assert(dir.exists); | |
| deleteme.rmdirRecurse; | |
| assert(!dir.exists); | |
| assert(!deleteme.exists); | |
| } | |
| @system unittest | |
| { | |
| import std.file; | |
| import std.algorithm.comparison : equal; | |
| import std.algorithm.iteration : map; | |
| import std.algorithm.sorting : sort; | |
| import std.array : array; | |
| import std.path : buildPath, relativePath; | |
| auto root = deleteme ~ "root"; | |
| scope(exit) root.rmdirRecurse; | |
| root.mkdir; | |
| root.buildPath("animals").mkdir; | |
| root.buildPath("animals", "cat").mkdir; | |
| alias removeRoot = (return scope e) => e.relativePath(root); | |
| assert(root.dirEntries(SpanMode.depth).map!removeRoot.equal( | |
| [buildPath("animals", "cat"), "animals"])); | |
| assert(root.dirEntries(SpanMode.breadth).map!removeRoot.equal( | |
| ["animals", buildPath("animals", "cat")])); | |
| root.buildPath("plants").mkdir; | |
| assert(root.dirEntries(SpanMode.shallow).array.sort.map!removeRoot.equal( | |
| ["animals", "plants"])); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| string[] listdir(string pathname) | |
| { | |
| import std.algorithm.iteration : map, filter; | |
| import std.array : array; | |
| import std.path : baseName; | |
| return dirEntries(pathname, SpanMode.shallow) | |
| .filter!(a => a.isFile) | |
| .map!((return a) => baseName(a.name)) | |
| .array; | |
| } | |
| // Can be safe only with -preview=dip1000 | |
| @safe void main(string[] args) | |
| { | |
| import std.stdio : writefln; | |
| string[] files = listdir(args[1]); | |
| writefln("%s", files); | |
| } | |
| } | |
| @system unittest | |
| { | |
| import std.file; | |
| import std.typecons : tuple; | |
| scope(exit) | |
| { | |
| assert(exists(deleteme)); | |
| remove(deleteme); | |
| } | |
| write(deleteme, "12 12.25\n345 1.125"); // deleteme is the name of a temporary file | |
| // Load file; each line is an int followed by comma, whitespace and a | |
| // double. | |
| auto a = slurp!(int, double)(deleteme, "%s %s"); | |
| assert(a.length == 2); | |
| assert(a[0] == tuple(12, 12.25)); | |
| assert(a[1] == tuple(345, 1.125)); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.ascii : letters; | |
| import std.conv : to; | |
| import std.path : buildPath; | |
| import std.random : randomSample; | |
| import std.utf : byCodeUnit; | |
| // random id with 20 letters | |
| auto id = letters.byCodeUnit.randomSample(20).to!string; | |
| auto myFile = tempDir.buildPath(id ~ "my_tmp_file"); | |
| scope(exit) myFile.remove; | |
| myFile.write("hello"); | |
| assert(myFile.readText == "hello"); | |
| } | |
| @safe unittest | |
| { | |
| import std.file; | |
| import std.exception : assertThrown; | |
| auto space = getAvailableDiskSpace("."); | |
| assert(space > 0); | |
| assertThrown!FileException(getAvailableDiskSpace("ThisFileDoesNotExist123123")); | |
| } | |