| @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")); |
| } |
| |