Utilities for manipulating files and scanning directories. Functions in this module handle files as a unit, e.g., read or write one file at a time. For opening files and manipulating them via handles refer to module std.stdio
.
Category | Functions |
---|---|
General | exists isDir isFile isSymlink rename thisExePath |
Directories | chdir dirEntries getcwd mkdir mkdirRecurse rmdir rmdirRecurse tempDir |
Files | append copy read readText remove slurp write |
Symlinks | symlink readLink |
Attributes | attrIsDir attrIsFile attrIsSymlink getAttributes getLinkAttributes getSize setAttributes |
Timestamp | getTimes getTimesWin setTimes timeLastModified timeLastAccessed timeStatusChanged |
Other | DirEntry FileException PreserveAttributes SpanMode getAvailableDiskSpace |
std.stdio
for opening files and manipulating them via handles, and module std.path
for manipulating path strings. Exception thrown for file I/O errors.
import std.exception : assertThrown; assertThrown!FileException("non.existing.file.".readText);
OS error code.
Constructor which takes an error message.
const(char)[] name
| Name of file for which the error occurred. |
const(char)[] msg
| Message describing the error. |
string file
| The file where the error occurred. |
size_t line
| The line where the error occurred. |
Constructor which takes the error number (GetLastError in Windows, errno in Posix).
const(char)[] name
| Name of file for which the error occurred. |
uint errno
| The error number. |
string file
| The file where the error occurred. Defaults to __FILE__ . |
size_t line
| The line where the error occurred. Defaults to __LINE__ . |
Read entire contents of file name
and returns it as an untyped array. If the file size is larger than upTo
, only upTo
bytes are read.
R name
| string or range of characters representing the file name |
size_t upTo
| if present, the maximum number of bytes to read |
FileException
on error.import std.utf : byChar; scope(exit) { assert(exists(deleteme)); remove(deleteme); } std.file.write(deleteme, "1234"); // deleteme is the name of a temporary file writeln(read(deleteme, 2)); // "12" writeln(read(deleteme.byChar)); // "1234" writeln((cast(const(ubyte)[])read(deleteme)).length); // 4
Reads and validates (using std.utf.validate
) a text file. S can be an array of any character type. However, no width or endian conversions are performed. So, if the width or endianness of the characters in the given file differ from the width or endianness of the element type of S, then validation will fail.
S | the string type of the file |
R name
| string or range of characters representing the file name |
FileException
if there is an error reading the file, std.utf.UTFException
on UTF decoding error.write(deleteme, "abc"); // deleteme is the name of a temporary file scope(exit) remove(deleteme); string content = readText(deleteme); writeln(content); // "abc"
Write buffer
to file name
.
Creates the file if it does not already exist.
R name
| string or range of characters representing the file name |
void[] buffer
| data to be written to file |
FileException
on error. std.stdio.toFile
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 writeln(cast(int[])read(deleteme)); // a
Appends buffer
to file name
.
Creates the file if it does not already exist.
R name
| string or range of characters representing the file name |
void[] buffer
| data to be appended to file |
FileException
on error.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); writeln(cast(int[])read(deleteme)); // a ~ b
Rename file from
to to
. If the target file exists, it is overwritten.
RF from
| string or range of characters representing the existing file name |
RT to
| string or range of characters representing the target file name |
FileException
on error.auto t1 = deleteme, t2 = deleteme~"2"; scope(exit) foreach (t; [t1, t2]) if (t.exists) t.remove(); t1.write("1"); t1.rename(t2); writeln(t2.readText); // "1" t1.write("2"); t1.rename(t2); writeln(t2.readText); // "2"
Delete file name
.
R name
| string or range of characters representing the file name |
FileException
on error.import std.exception : assertThrown; deleteme.write("Hello"); writeln(deleteme.readText); // "Hello" deleteme.remove; assertThrown!FileException(deleteme.readText);
Get size of file name
in bytes.
R name
| string or range of characters representing the file name |
FileException
on error (e.g., file not found).scope(exit) deleteme.remove; // create a file of size 1 write(deleteme, "a"); writeln(getSize(deleteme)); // 1 // create a file of size 3 write(deleteme, "abc"); writeln(getSize(deleteme)); // 3
Get the access and modified times of file or folder name
.
R name
| File/Folder name to get times for. |
SysTime accessTime
| Time the file/folder was last accessed. |
SysTime modificationTime
| Time the file/folder was last modified. |
FileException
on error.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);
This function is Windows-Only.
Get creation/access/modified times of file name
.
This is the same as getTimes
except that it also gives you the file creation time - which isn't possible on Posix systems.
R name
| File name to get times for. |
SysTime fileCreationTime
| Time the file was created. |
SysTime fileAccessTime
| Time the file was last accessed. |
SysTime fileModificationTime
| Time the file was last modified. |
FileException
on error.Set access/modified times of file or folder name
.
R name
| File/Folder name to get times for. |
SysTime accessTime
| Time the file/folder was last accessed. |
SysTime modificationTime
| Time the file/folder was last modified. |
FileException
on error.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); writeln(accessTime); // accessTimeResolved writeln(modificationTime); // modificationTimeResolved
Returns the time that the given file was last modified.
R name
| the name of the file to check |
std.datetime.systime.SysTime
. FileException
if the given file does not exist.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);
Returns the time that the given file was last modified. If the file does not exist, returns returnIfMissing
.
A frequent usage pattern occurs in build automation tools such as make or ant. To check whether file target
must be rebuilt from file source
(i.e., target
is older than source
or does not exist), use the comparison below. The code throws a FileException
if source
does not exist (as it should). On the other hand, the SysTime.min
default makes a non-existing target
seem infinitely old so the test correctly prompts building it.
R name
| The name of the file to get the modification time for. |
SysTime returnIfMissing
| The time to return if the given file does not exist. |
std.datetime.systime.SysTime
. if (source.timeLastModified >= target.timeLastModified(SysTime.min)) { // must (re)build } else { // target is up-to-date }
import std.datetime : SysTime; writeln("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);
This function is Posix-Only.
Returns the time that the given file was last modified.
stat_t statbuf
| stat_t retrieved from file. |
This function is Posix-Only.
Returns the time that the given file was last accessed.
stat_t statbuf
| stat_t retrieved from file. |
This function is Posix-Only.
Returns the time that the given file was last changed.
stat_t statbuf
| stat_t retrieved from file. |
Determine whether the given file (or directory) exists.
R name
| string or range of characters representing the file name |
auto f = deleteme ~ "does.not.exist"; assert(!f.exists); f.write("hello"); assert(f.exists); f.remove; assert(!f.exists);
Returns the attributes of the given file.
Note that the file attributes on Windows and Posix systems are completely different. On Windows, they're what is returned by GetFileAttributes, whereas on Posix systems, they're the st_mode
value which is part of the stat struct
gotten by calling the stat
function.
On Posix systems, if the given file is a symbolic link, then attributes are the attributes of the file pointed to by the symbolic link.
R name
| The file to get the attributes of. |
uint
. FileException
on error.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);
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);
If the given file is a symbolic link, then this returns the attributes of the symbolic link itself rather than file that it points to. If the given file is not a symbolic link, then this function returns the same result as getAttributes.
On Windows, getLinkAttributes is identical to getAttributes. It exists on Windows so that you don't have to special-case code for Windows when dealing with symbolic links.
R name
| The file to get the symbolic link attributes of. |
FileException
on error.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); writeln(source.readText); // "target" assert(source.isSymlink); assert(source.getLinkAttributes.attrIsSymlink); }
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);
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);
Set the attributes of the given file.
R name
| the file name |
uint attributes
| the attributes to set the file to |
FileException
if the given file does not exist.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; writeln((attributes & 1023)); // octal!777 }
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; writeln((attributes & 1023)); // octal!777 }
Returns whether the given file is a directory.
R name
| The path to the file. |
FileException
if the given file does not exist.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);
Returns whether the given file attributes are for a directory.
uint attributes
| The file attributes. |
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);
Returns whether the given file (or directory) is a file.
On Windows, if a file is not a directory, then it's a file. So, either isFile
or isDir
will return true for any given file.
On Posix systems, if isFile
is true
, that indicates that the file is a regular file (e.g. not a block not device). So, on Posix systems, it's possible for both isFile
and isDir
to be false
for a particular file (in which case, it's a special file). You can use getAttributes
to get the attributes to figure out what type of special it is, or you can use DirEntry
to get at its statBuf
, which is the result from stat
. In either case, see the man page for stat
for more information.
R name
| The path to the file. |
FileException
if the given file does not exist.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);
Returns whether the given file attributes are for a file.
On Windows, if a file is not a directory, it's a file. So, either attrIsFile
or attrIsDir
will return true
for the attributes of any given file.
On Posix systems, if attrIsFile
is true
, that indicates that the file is a regular file (e.g. not a block not device). So, on Posix systems, it's possible for both attrIsFile
and attrIsDir
to be false
for a particular file (in which case, it's a special file). If a file is a special file, you can use the attributes to check what type of special file it is (see the man page for stat
for more information).
uint attributes
| The file attributes. |
assert(attrIsFile(getAttributes("/etc/fonts/fonts.conf"))); assert(attrIsFile(getLinkAttributes("/etc/fonts/fonts.conf")));
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);
Returns whether the given file is a symbolic link.
On Windows, returns true
when the file is either a symbolic link or a junction point.
R name
| The path to the file. |
FileException
if the given file does not exist.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); writeln(source.readText); // "target" assert(source.isSymlink); assert(source.getLinkAttributes.attrIsSymlink); }
Returns whether the given file attributes are for a symbolic link.
On Windows, return true
when the file is either a symbolic link or a junction point.
uint attributes
| The file attributes. |
core.sys.posix.unistd.symlink("/etc/fonts/fonts.conf", "/tmp/alink"); assert(!getAttributes("/tmp/alink").isSymlink); assert(getLinkAttributes("/tmp/alink").isSymlink);
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); writeln(source.readText); // "target" assert(source.isSymlink); assert(source.getLinkAttributes.attrIsSymlink); }
Change directory to pathname
. Equivalent to cd
on Windows and Posix.
R pathname
| the directory to step into |
FileException
on error.import std.algorithm.comparison : equal; 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("."); dirEntries(".", SpanMode.shallow).equal( [".".buildPath("b"), ".".buildPath("a")] );
Make a new directory pathname
.
R pathname
| the path of the directory to make |
FileException
on Posix or WindowsException
on Windows if an error occured.import std.file : mkdir; auto dir = deleteme ~ "dir"; scope(exit) dir.rmdir; dir.mkdir; assert(dir.exists);
import std.exception : assertThrown; assertThrown("a/b/c/d/e".mkdir);
Make directory and all parent directories as needed.
Does nothing if the directory specified by pathname
already exists.
const(char)[] pathname
| the full path of the directory to create |
FileException
on error.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);
import std.exception : assertThrown; scope(exit) deleteme.remove; deleteme.write("a"); // cannot make directory as it's already a file assertThrown!FileException(deleteme.mkdirRecurse);
Remove directory pathname
.
R pathname
| Range or string specifying the directory name |
FileException
on error.auto dir = deleteme ~ "dir"; dir.mkdir; assert(dir.exists); dir.rmdir; assert(!dir.exists);
This function is Posix-Only.
Creates a symbolic link (symlink).
RO original
| The file that is being linked. This is the target path that's stored in the symlink. A relative path is relative to the created symlink. |
RL link
| The symlink to create. A relative path is relative to the current working directory. |
FileException
on error (which includes if the symlink already exists).This function is Posix-Only.
Returns the path to the file pointed to by a symlink. Note that the path could be either relative or absolute depending on the symlink. If the path is relative, it's relative to the symlink, not the current working directory.
FileException
on error.Get the current working directory.
FileException
on error.auto s = getcwd(); assert(s.length);
Returns the full path of the current executable.
string
. Exception
import std.path : isAbsolute; auto path = thisExePath(); assert(path.exists); assert(path.isAbsolute); assert(path.isFile);
Info on a file, similar to what you'd get from stat on a Posix system.
Constructs a DirEntry
for the given file (or directory).
string path
| The file (or directory) to get a DirEntry for. |
FileException
if the file does not exist.Returns the path to the file represented by this DirEntry
.
auto de1 = DirEntry("/etc/fonts/fonts.conf"); assert(de1.name == "/etc/fonts/fonts.conf"); auto de2 = DirEntry("/usr/share/include"); assert(de2.name == "/usr/share/include");
Returns whether the file represented by this DirEntry
is a directory.
auto de1 = DirEntry("/etc/fonts/fonts.conf"); assert(!de1.isDir); auto de2 = DirEntry("/usr/share/include"); assert(de2.isDir);
Returns whether the file represented by this DirEntry
is a file.
On Windows, if a file is not a directory, then it's a file. So, either isFile
or isDir
will return true
.
On Posix systems, if isFile
is true
, that indicates that the file is a regular file (e.g. not a block not device). So, on Posix systems, it's possible for both isFile
and isDir
to be false
for a particular file (in which case, it's a special file). You can use attributes
or statBuf
to get more information about a special file (see the stat man page for more details).
auto de1 = DirEntry("/etc/fonts/fonts.conf"); assert(de1.isFile); auto de2 = DirEntry("/usr/share/include"); assert(!de2.isFile);
Returns whether the file represented by this DirEntry
is a symbolic link.
On Windows, return true
when the file is either a symbolic link or a junction point.
Returns the size of the the file represented by this DirEntry
in bytes.
This function is Windows-Only.
Returns the creation time of the file represented by this DirEntry
.
Returns the time that the file represented by this DirEntry
was last accessed.
Note that many file systems do not update the access time for files (generally for performance reasons), so there's a good chance that timeLastAccessed
will return the same value as timeLastModified
.
Returns the time that the file represented by this DirEntry
was last modified.
This function is Posix-Only.
Returns the time that the file represented by this DirEntry
was last changed (not only in contents, but also in permissions or ownership).
Returns the attributes of the file represented by this DirEntry
.
Note that the file attributes on Windows and Posix systems are completely different. On, Windows, they're what is returned by GetFileAttributes
GetFileAttributes Whereas, an Posix systems, they're the st_mode
value which is part of the stat
struct gotten by calling stat
.
On Posix systems, if the file represented by this DirEntry
is a symbolic link, then attributes are the attributes of the file pointed to by the symbolic link.
On Posix systems, if the file represented by this DirEntry
is a symbolic link, then linkAttributes
are the attributes of the symbolic link itself. Otherwise, linkAttributes
is identical to attributes
.
On Windows, linkAttributes
is identical to attributes
. It exists on Windows so that you don't have to special-case code for Windows when dealing with symbolic links.
This function is Posix-Only.
The stat
struct gotten from calling stat
.
Defaults to Yes.preserveAttributes
on Windows, and the opposite on all other platforms.
Copy file from
to file to
. File timestamps are preserved. File attributes are preserved, if preserve
equals Yes.preserveAttributes
. On Windows only Yes.preserveAttributes
(the default on Windows) is supported. If the target file exists, it is overwritten.
RF from
| string or range of characters representing the existing file name |
RT to
| string or range of characters representing the target file name |
PreserveAttributes preserve
| whether to preserve the file attributes |
FileException
on error.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"); writeln(target.readText); // "target" source.copy(target); writeln(target.readText); // "source" source.copy(targetNonExistent); writeln(targetNonExistent.readText); // "source"
Remove directory and all of its content and subdirectories, recursively.
const(char)[] pathname
| the path of the directory to completely remove |
DirEntry de
| The DirEntry to remove |
FileException
if there is an error (including if the given file is not a directory).import std.path : buildPath; auto dir = deleteme.buildPath("a", "b", "c"); dir.mkdirRecurse; assert(dir.exists); deleteme.rmdirRecurse; assert(!dir.exists); assert(!deleteme.exists);
Dictates directory spanning policy for dirEntries (see below).
import std.algorithm.comparison : equal; import std.algorithm.iteration : map; import std.path : buildPath, relativePath; auto root = deleteme ~ "root"; scope(exit) root.rmdirRecurse; root.mkdir; root.buildPath("animals").mkdir; root.buildPath("animals", "cat").mkdir; root.buildPath("animals", "dog").mkdir; root.buildPath("plants").mkdir; alias removeRoot = (e) => e.relativePath(root); root.dirEntries(SpanMode.shallow).map!removeRoot.equal( ["plants", "animals"]); root.dirEntries(SpanMode.depth).map!removeRoot.equal( ["plants", "animals/dog", "animals/cat", "animals"]); root.dirEntries(SpanMode.breadth).map!removeRoot.equal( ["plants", "animals", "animals/dog", "animals/cat"]);
Only spans one directory.
Spans the directory in depth-first post-order, i.e. the content of any subdirectory is spanned before that subdirectory itself. Useful e.g. when recursively deleting files.
Spans the directory in depth-first pre-order, i.e. the content of any subdirectory is spanned right after that subdirectory itself.
Note that SpanMode.breadth
will not result in all directory members occurring before any subdirectory members, i.e. it is not true breadth-first traversal.
Returns an input range of DirEntry
that lazily iterates a given directory, also provides two ways of foreach iteration. The iteration variable can be of type string
if only the name is needed, or DirEntry
if additional details are needed. The span mode dictates how the directory is traversed. The name of each iterated directory entry contains the absolute or relative path (depending on pathname).
string path
| The directory to iterate over. If empty, the current directory will be iterated. |
string pattern
| Optional string with wildcards, such as "*.d". When present, it is used to filter the results by their file name. The supported wildcard strings are described under std.path.globMatch . |
SpanMode mode
| Whether the directory's sub-directories should be iterated in depth-first post-order (depth ), depth-first pre-order (breadth ), or not at all (shallow ). |
bool followSymlink
| Whether symbolic links which point to directories should be treated as directories and their contents iterated over. |
DirEntry
. FileException
if the directory does not exist. // Iterate a directory in depth foreach (string name; dirEntries("destroy/me", SpanMode.depth)) { remove(name); } // Iterate the current directory in breadth foreach (string name; dirEntries("", SpanMode.breadth)) { writeln(name); } // Iterate a directory and get detailed info about it foreach (DirEntry e; dirEntries("dmd-testing", SpanMode.breadth)) { writeln(e.name, "\t", e.size); } // Iterate over all *.d files in current directory and all its subdirectories auto dFiles = dirEntries("", SpanMode.depth).filter!(f => f.name.endsWith(".d")); foreach (d; dFiles) writeln(d.name); // Hook it up with std.parallelism to compile them all in parallel: foreach (d; parallel(dFiles, 1)) //passes by 1 file to each thread { string cmd = "dmd -c " ~ d.name; writeln(cmd); std.process.executeShell(cmd); } // Iterate over all D source files in current directory and all its // subdirectories auto dFiles = dirEntries("","*.{d,di}",SpanMode.depth); foreach (d; dFiles) writeln(d.name);
std.file.listdir()
: string[] listdir(string pathname) { import std.algorithm; import std.array; import std.file; import std.path; return std.file.dirEntries(pathname, SpanMode.shallow) .filter!(a => a.isFile) .map!(a => std.path.baseName(a.name)) .array; } void main(string[] args) { import std.stdio; string[] files = listdir(args[1]); writefln("%s", files); }
Reads a file line by line and parses the line into a single value or a std.typecons.Tuple
of values depending on the length of Types
. The lines are parsed using the specified format string. The format string is passed to std.format.formattedRead
, and therefore must conform to the format string specification outlined in std.format
.
Types | the types that each of the elements in the line should be returned as |
string filename
| the name of the file to read |
const(char)[] format
| the format string to use when reading |
std.typecons.Tuple
s. Exception
if the format string is malformed. Also, throws Exception
if any of the lines in the file are not fully consumed by the call to std.format.formattedRead
. Meaning that no empty lines or lines with extra characters are allowed.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"); writeln(a.length); // 2 writeln(a[0]); // tuple(12, 12.25) writeln(a[1]); // tuple(345, 1.125)
Returns the path to a directory for temporary files.
The return value of the function is cached, so the procedures described below will only be performed the first time the function is called. All subsequent runs will return the same string, regardless of whether environment variables and directory structures have changed in the meantime.
The POSIX tempDir
algorithm is inspired by Python's tempfile.tempdir
.
GetTempPath
. On POSIX platforms, it searches through the following list of directories and returns the first one which is found to exist: TMPDIR
environment variable.TEMP
environment variable.TMP
environment variable./tmp
/var/tmp
/usr/tmp
tempDir
returns "."
on failure, representing the current working directory.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"); writeln(myFile.readText); // "hello"
Returns the available disk space based on a given path. On Windows, path
must be a directory; on Posix systems, it can be a file or directory.
const(char)[] path
| on Windows, it must be a directory; on Posix it can be a file or directory |
FileException
in case of failureimport std.exception : assertThrown; auto space = getAvailableDiskSpace("."); assert(space > 0); assertThrown!FileException(getAvailableDiskSpace("ThisFileDoesNotExist123123"));
© 1999–2019 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/std_file.html