std.path
Upgrading: digitalmars.com/d/1.0/phobos/std_path.html#fnmatch can be replaced with globMatch.
Source: std/path.d
- enum string
dirSeparator
; - String used to separate directory names in a path. Under POSIX this is a slash, under Windows a backslash.
- enum string
pathSeparator
; - Path separator string. A colon under POSIX, a semicolon under Windows.
- pure nothrow @nogc @safe bool
isDirSeparator
(dcharc
); - Determines whether the given character is a directory separator.On Windows, this includes both \ and /. On POSIX, it's just /.
- enum
CaseSensitive
: bool; - This enum is used as a template argument to functions which compare file names, and determines whether the comparison is case sensitive or not.
no
- File names are case insensitive
yes
- File names are case sensitive
osDefault
- The default (or most common) setting for the current platform. That is, no on Windows and Mac OS X, and yes on all POSIX systems except OS X (Linux, *BSD, etc.).
- auto
baseName
(R)(Rpath
)
if (isRandomAccessRange!R && hasSlicing!R && isSomeChar!(ElementType!R) || is(StringTypeOf!R));
pure @safe inout(C)[]baseName
(CaseSensitive cs = CaseSensitive.osDefault, C, C1)(inout(C)[]path
, in C1[]suffix
)
if (isSomeChar!C && isSomeChar!C1); - Parameters:
cs Whether or not suffix
matching is case-sensitive.R path
A path
name. It can be a string, or any random-access range of characters.C1[] suffix
An optional suffix
to be removed from the file name.Returns:The name of the file in thepath
name, without any leading directory and with an optionalsuffix
chopped off. Ifsuffix
is specified, it will be compared topath
using filenameCmp!cs, where cs is an optional template parameter determining whether the comparison is case sensitive or not. See the filenameCmp documentation for details.Example:
assert (baseName("dir/file.ext") == "file.ext"); assert (baseName("dir/file.ext", ".ext") == "file"); assert (baseName("dir/file.ext", ".xyz") == "file.ext"); assert (baseName("dir/filename", "name") == "file"); assert (baseName("dir/subdir/") == "subdir"); version (Windows) { assert (baseName(`d:file.ext`) == "file.ext"); assert (baseName(`d:\dir\file.ext`) == "file.ext"); }
Note: This function only strips away the specified
suffix
, which doesn't necessarily have to represent an extension. To remove the extension from apath
, regardless of what the extension is, use stripExtension. To obtain the filename without leading directories and without an extension, combine the functions like this:assert (baseName(stripExtension("dir/file.ext")) == "file");
Standards:This function complies with the POSIX requirements for the 'basename' shell utility (with suitable adaptations for Windows paths). - auto
dirName
(R)(Rpath
)
if ((isRandomAccessRange!R && hasSlicing!R && hasLength!R && isSomeChar!(ElementType!R) || isNarrowString!R) && !isConvertibleToString!R); - Returns the directory part of a
path
. On Windows, this includes the drive letter if present.Parameters:R path
A path
name.Returns:A slice ofpath
or ".".Standards:This function complies with the POSIX requirements for the 'dirname' shell utility (with suitable adaptations for Windows paths).Examples:assert (dirName("") == "."); assert (dirName("file"w) == "."); assert (dirName("dir/"d) == "."); assert (dirName("dir///") == "."); assert (dirName("dir/file"w.dup) == "dir"); assert (dirName("dir///file"d.dup) == "dir"); assert (dirName("dir/subdir/") == "dir"); assert (dirName("/dir/file"w) == "/dir"); assert (dirName("/file"d) == "/"); assert (dirName("/") == "/"); assert (dirName("///") == "/"); version (Windows) { assert (dirName(`dir\`) == `.`); assert (dirName(`dir\\\`) == `.`); assert (dirName(`dir\file`) == `dir`); assert (dirName(`dir\\\file`) == `dir`); assert (dirName(`dir\subdir\`) == `dir`); assert (dirName(`\dir\file`) == `\dir`); assert (dirName(`\file`) == `\`); assert (dirName(`\`) == `\`); assert (dirName(`\\\`) == `\`); assert (dirName(`d:`) == `d:`); assert (dirName(`d:file`) == `d:`); assert (dirName(`d:\`) == `d:\`); assert (dirName(`d:\file`) == `d:\`); assert (dirName(`d:\dir\file`) == `d:\dir`); assert (dirName(`\\server\share\dir\file`) == `\\server\share\dir`); assert (dirName(`\\server\share\file`) == `\\server\share`); assert (dirName(`\\server\share\`) == `\\server\share`); assert (dirName(`\\server\share`) == `\\server\share`); }
- auto
rootName
(R)(Rpath
)
if ((isRandomAccessRange!R && hasSlicing!R && hasLength!R && isSomeChar!(ElementType!R) || isNarrowString!R) && !isConvertibleToString!R); - Returns the root directory of the specified
path
, ornull
if thepath
is not rooted.Parameters:R path
A path
name.Returns:A slice ofpath
.Examples:assert (rootName("") is null); assert (rootName("foo") is null); assert (rootName("/") == "/"); assert (rootName("/foo/bar") == "/"); version (Windows) { assert (rootName("d:foo") is null); assert (rootName(`d:\foo`) == `d:\`); assert (rootName(`\\server\share\foo`) == `\\server\share`); assert (rootName(`\\server\share`) == `\\server\share`); }
- auto
driveName
(R)(Rpath
)
if ((isRandomAccessRange!R && hasSlicing!R && hasLength!R && isSomeChar!(ElementType!R) || isNarrowString!R) && !isConvertibleToString!R); - Get the drive portion of a
path
.Parameters:R path
string or range of characters Returns:A slice of path that is the drive, or an empty range if the drive is not specified. In the case of UNC paths, the network share is returned. Always returns an empty range on POSIX.Examples:import std.range : empty; version (Posix) assert (driveName("c:/foo").empty); version (Windows) { assert (driveName(`dir\file`).empty); assert (driveName(`d:file`) == "d:"); assert (driveName(`d:\file`) == "d:"); assert (driveName("d:") == "d:"); assert (driveName(`\\server\share\file`) == `\\server\share`); assert (driveName(`\\server\share\`) == `\\server\share`); assert (driveName(`\\server\share`) == `\\server\share`); static assert (driveName(`d:\file`) == "d:"); }
- auto
stripDrive
(R)(Rpath
)
if ((isRandomAccessRange!R && hasSlicing!R && isSomeChar!(ElementType!R) || isNarrowString!R) && !isConvertibleToString!R); - Strips the drive from a Windows
path
. On POSIX, thepath
is returned unaltered.Parameters:R path
A pathname Returns:A slice ofpath
without the drive component.Examples:version (Windows) { assert (stripDrive(`d:\dir\file`) == `\dir\file`); assert (stripDrive(`\\server\share\dir\file`) == `\dir\file`); }
- auto
extension
(R)(Rpath
)
if (isRandomAccessRange!R && hasSlicing!R && isSomeChar!(ElementType!R) || is(StringTypeOf!R)); - Parameters:
R path
A path
name.Returns:The extension part of a file name, including the dot. If there is no extension,null
is returned.Examples:import std.range : empty; assert (extension("file").empty); assert (extension("file.") == "."); assert (extension("file.ext"w) == ".ext"); assert (extension("file.ext1.ext2"d) == ".ext2"); assert (extension(".foo".dup).empty); assert (extension(".foo.ext"w.dup) == ".ext"); static assert (extension("file").empty); static assert (extension("file.ext") == ".ext");
- auto
stripExtension
(R)(Rpath
)
if ((isRandomAccessRange!R && hasSlicing!R && hasLength!R && isSomeChar!(ElementType!R) || isNarrowString!R) && !isConvertibleToString!R); - Remove extension from
path
.Parameters:R path
string or range to be sliced Returns:slice ofpath
with the extension (if any) stripped offExamples:assert (stripExtension("file") == "file"); assert (stripExtension("file.ext") == "file"); assert (stripExtension("file.ext1.ext2") == "file.ext1"); assert (stripExtension("file.") == "file"); assert (stripExtension(".file") == ".file"); assert (stripExtension(".file.ext") == ".file"); assert (stripExtension("dir/file.ext") == "dir/file");
- immutable(Unqual!C1)[]
setExtension
(C1, C2)(in C1[]path
, in C2[]ext
)
if (isSomeChar!C1 && !is(C1 == immutable) && is(Unqual!C1 == Unqual!C2));
immutable(C1)[]setExtension
(C1, C2)(immutable(C1)[]path
, const(C2)[]ext
)
if (isSomeChar!C1 && is(Unqual!C1 == Unqual!C2)); - Sets or replaces an extension.If the filename already has an extension, it is replaced. If not, the extension is simply appended to the filename. Including a leading dot in
ext
is optional. If the extension is empty, this function is equivalent to stripExtension. This function normally allocates a new string (the possible exception being the case whenpath
is immutable and doesn't already have an extension).Parameters:C1[] path
A path
nameC2[] ext
The new extension Returns:A string containing the path given bypath
, but where the extension has been set toext
.See Also:withExtension which does not allocate and returns a lazy range.Examples:assert (setExtension("file", "ext") == "file.ext"); assert (setExtension("file"w, ".ext"w) == "file.ext"); assert (setExtension("file."d, "ext"d) == "file.ext"); assert (setExtension("file.", ".ext") == "file.ext"); assert (setExtension("file.old"w, "new"w) == "file.new"); assert (setExtension("file.old"d, ".new"d) == "file.new");
- auto
withExtension
(R, C)(Rpath
, C[]ext
)
if ((isRandomAccessRange!R && hasSlicing!R && hasLength!R && isSomeChar!(ElementType!R) || isNarrowString!R) && !isConvertibleToString!R && isSomeChar!C); - Replace existing extension on filespec with new one.Parameters:
R path
string or random access range representing a filespec C[] ext
the new extension Returns:Range withpath
's extension (if any) replaced withext
. The element encoding type of the returned range will be the same aspath
's.See Also:Examples:import std.array; assert (withExtension("file", "ext").array == "file.ext"); assert (withExtension("file"w, ".ext"w).array == "file.ext"); assert (withExtension("file.ext"w, ".").array == "file."); import std.utf : byChar, byWchar; assert (withExtension("file".byChar, "ext").array == "file.ext"); assert (withExtension("file"w.byWchar, ".ext"w).array == "file.ext"w); assert (withExtension("file.ext"w.byWchar, ".").array == "file."w);
- immutable(Unqual!C1)[]
defaultExtension
(C1, C2)(in C1[]path
, in C2[]ext
)
if (isSomeChar!C1 && is(Unqual!C1 == Unqual!C2)); - Parameters:
C1[] path
A path
name.C2[] ext
The default extension to use. Returns:The path given bypath
, with the extension given byext
appended if thepath
doesn't already have one. Including the dot in the extension is optional. This function always allocates a new string, except in the case whenpath
is immutable and already has an extension.Examples:assert (defaultExtension("file", "ext") == "file.ext"); assert (defaultExtension("file", ".ext") == "file.ext"); assert (defaultExtension("file.", "ext") == "file."); assert (defaultExtension("file.old", "new") == "file.old"); assert (defaultExtension("file.old", ".new") == "file.old");
- auto
withDefaultExtension
(R, C)(Rpath
, C[]ext
)
if ((isRandomAccessRange!R && hasSlicing!R && hasLength!R && isSomeChar!(ElementType!R) || isNarrowString!R) && !isConvertibleToString!R && isSomeChar!C); - Set the extension of
path
toext
ifpath
doesn't have one.Parameters:R path
filespec as string or range C[] ext
extension, may have leading '.' Returns:range with the resultExamples:import std.array; assert (withDefaultExtension("file", "ext").array == "file.ext"); assert (withDefaultExtension("file"w, ".ext").array == "file.ext"w); assert (withDefaultExtension("file.", "ext").array == "file."); assert (withDefaultExtension("file", "").array == "file."); import std.utf : byChar, byWchar; assert (withDefaultExtension("file".byChar, "ext").array == "file.ext"); assert (withDefaultExtension("file"w.byWchar, ".ext").array == "file.ext"w); assert (withDefaultExtension("file.".byChar, "ext"d).array == "file."); assert (withDefaultExtension("file".byChar, "").array == "file.");
- immutable(ElementEncodingType!(ElementType!Range))[]
buildPath
(Range)(Rangesegments
)
if (isInputRange!Range && isSomeString!(ElementType!Range));
pure nothrow @safe immutable(C)[]buildPath
(C)(const(C)[][]paths
...)
if (isSomeChar!C); - Combines one or more path
segments
.This function takes a set of pathsegments
, given as an input range of string elements or as a set of string arguments, and concatenates them with each other. Directory separators are inserted betweensegments
if necessary. If any of the pathsegments
are absolute (as defined by isAbsolute), the precedingsegments
will be dropped. On Windows, if one of the pathsegments
are rooted, but not absolute (e.g. \foo), all preceding pathsegments
down to the previous root will be dropped. (See below for an example.) This function always allocates memory to hold the resulting path. The variadic overload is guaranteed to only perform a single allocation, as is the range version ifpaths
is a forward range.Parameters:Range segments
An input range of segments
to assemble the path from.Returns:The assembled path.Examples:version (Posix) { assert (buildPath("foo", "bar", "baz") == "foo/bar/baz"); assert (buildPath("/foo/", "bar/baz") == "/foo/bar/baz"); assert (buildPath("/foo", "/bar") == "/bar"); } version (Windows) { assert (buildPath("foo", "bar", "baz") == `foo\bar\baz`); assert (buildPath(`c:\foo`, `bar\baz`) == `c:\foo\bar\baz`); assert (buildPath("foo", `d:\bar`) == `d:\bar`); assert (buildPath("foo", `\bar`) == `\bar`); assert (buildPath(`c:\foo`, `\bar`) == `c:\bar`); }
- auto
chainPath
(R1, R2, Ranges...)(R1r1
, R2r2
, Rangesranges
)
if ((isRandomAccessRange!R1 && hasSlicing!R1 && hasLength!R1 && isSomeChar!(ElementType!R1) || isNarrowString!R1 && !isConvertibleToString!R1) && (isRandomAccessRange!R2 && hasSlicing!R2 && hasLength!R2 && isSomeChar!(ElementType!R2) || isNarrowString!R2 && !isConvertibleToString!R2) && (Ranges.length == 0 || is(typeof(chainPath
(r2
,ranges
))))); - Concatenate path segments together to form one path.Parameters:
R1 r1
first segment R2 r2
second segment Ranges ranges
0 or more segments Returns:Lazy range which is the concatenation ofr1
,r2
andranges
with path separators. The resulting element type is that ofr1
.See Also:Examples:import std.array; version (Posix) { assert (chainPath("foo", "bar", "baz").array == "foo/bar/baz"); assert (chainPath("/foo/", "bar/baz").array == "/foo/bar/baz"); assert (chainPath("/foo", "/bar").array == "/bar"); } version (Windows) { assert (chainPath("foo", "bar", "baz").array == `foo\bar\baz`); assert (chainPath(`c:\foo`, `bar\baz`).array == `c:\foo\bar\baz`); assert (chainPath("foo", `d:\bar`).array == `d:\bar`); assert (chainPath("foo", `\bar`).array == `\bar`); assert (chainPath(`c:\foo`, `\bar`).array == `c:\bar`); } import std.utf : byChar; version (Posix) { assert (chainPath("foo", "bar", "baz").array == "foo/bar/baz"); assert (chainPath("/foo/".byChar, "bar/baz").array == "/foo/bar/baz"); assert (chainPath("/foo", "/bar".byChar).array == "/bar"); } version (Windows) { assert (chainPath("foo", "bar", "baz").array == `foo\bar\baz`); assert (chainPath(`c:\foo`.byChar, `bar\baz`).array == `c:\foo\bar\baz`); assert (chainPath("foo", `d:\bar`).array == `d:\bar`); assert (chainPath("foo", `\bar`.byChar).array == `\bar`); assert (chainPath(`c:\foo`, `\bar`w).array == `c:\bar`); }
- pure nothrow @trusted immutable(C)[]
buildNormalizedPath
(C)(const(C[])[]paths
...)
if (isSomeChar!C); - Performs the same task as buildPath, while at the same time resolving current/parent directory symbols ("." and "..") and removing superfluous directory separators. It will return "." if the path leads to the starting directory. On Windows, slashes are replaced with backslashes.Using
buildNormalizedPath
onnull
paths
will always returnnull
. Note that this function does not resolve symbolic links. This function always allocates memory to hold the resulting path. Use asNormalizedPath to not allocate memory.Parameters:const(C[])[] paths
An array of paths
to assemble.Returns:The assembled path.Examples:assert (buildNormalizedPath("foo", "..") == "."); version (Posix) { assert (buildNormalizedPath("/foo/./bar/..//baz/") == "/foo/baz"); assert (buildNormalizedPath("../foo/.") == "../foo"); assert (buildNormalizedPath("/foo", "bar/baz/") == "/foo/bar/baz"); assert (buildNormalizedPath("/foo", "/bar/..", "baz") == "/baz"); assert (buildNormalizedPath("foo/./bar", "../../", "../baz") == "../baz"); assert (buildNormalizedPath("/foo/./bar", "../../baz") == "/baz"); } version (Windows) { assert (buildNormalizedPath(`c:\foo\.\bar/..\\baz\`) == `c:\foo\baz`); assert (buildNormalizedPath(`..\foo\.`) == `..\foo`); assert (buildNormalizedPath(`c:\foo`, `bar\baz\`) == `c:\foo\bar\baz`); assert (buildNormalizedPath(`c:\foo`, `bar/..`) == `c:\foo`); assert (buildNormalizedPath(`\\server\share\foo`, `..\bar`) == `\\server\share\bar`); }
- auto
asNormalizedPath
(R)(Rpath
)
if (isSomeChar!(ElementEncodingType!R) && (isRandomAccessRange!R && hasSlicing!R && hasLength!R || isNarrowString!R) && !isConvertibleToString!R); - Normalize a
path
by resolving current/parent directory symbols ("." and "..") and removing superfluous directory separators. It will return "." if thepath
leads to the starting directory. On Windows, slashes are replaced with backslashes.UsingasNormalizedPath
on empty paths will always return an emptypath
. Does not resolve symbolic links. This function always allocates memory to hold the resultingpath
. Use buildNormalizedPath to allocate memory and return a string.Parameters:R path
string or random access range representing the path to normalize Returns:normalizedpath
as a forward rangeExamples:import std.array; assert (asNormalizedPath("foo/..").array == "."); version (Posix) { assert (asNormalizedPath("/foo/./bar/..//baz/").array == "/foo/baz"); assert (asNormalizedPath("../foo/.").array == "../foo"); assert (asNormalizedPath("/foo/bar/baz/").array == "/foo/bar/baz"); assert (asNormalizedPath("/foo/./bar/../../baz").array == "/baz"); } version (Windows) { assert (asNormalizedPath(`c:\foo\.\bar/..\\baz\`).array == `c:\foo\baz`); assert (asNormalizedPath(`..\foo\.`).array == `..\foo`); assert (asNormalizedPath(`c:\foo\bar\baz\`).array == `c:\foo\bar\baz`); assert (asNormalizedPath(`c:\foo\bar/..`).array == `c:\foo`); assert (asNormalizedPath(`\\server\share\foo\..\bar`).array == `\\server\share\bar`); }
- auto
pathSplitter
(R)(Rpath
)
if ((isRandomAccessRange!R && hasSlicing!R || isNarrowString!R) && !isConvertibleToString!R); - Slice up a
path
into its elements.Parameters:R path
string or slicable random access range Returns:bidirectional range of slices ofpath
Examples:import std.algorithm.comparison : equal; import std.conv : to; assert (equal(pathSplitter("/"), ["/"])); assert (equal(pathSplitter("/foo/bar"), ["/", "foo", "bar"])); assert (equal(pathSplitter("foo/../bar//./"), ["foo", "..", "bar", "."])); version (Posix) { assert (equal(pathSplitter("//foo/bar"), ["/", "foo", "bar"])); } version (Windows) { assert (equal(pathSplitter(`foo\..\bar\/.\`), ["foo", "..", "bar", "."])); assert (equal(pathSplitter("c:"), ["c:"])); assert (equal(pathSplitter(`c:\foo\bar`), [`c:\`, "foo", "bar"])); assert (equal(pathSplitter(`c:foo\bar`), ["c:foo", "bar"])); }
- bool
isRooted
(R)(Rpath
)
if (isRandomAccessRange!R && isSomeChar!(ElementType!R) || is(StringTypeOf!R)); - Determines whether a
path
starts at a root directory.Parameters:R path
A path
name.Returns:Whether apath
starts at a root directory. On POSIX, this function returnstrue
if and only if thepath
starts with a slash (/).version (Posix) { assert (isRooted("/")); assert (isRooted("/foo")); assert (!isRooted("foo")); assert (!isRooted("../foo")); }
On Windows, this function returnstrue
if thepath
starts at the root directory of the current drive, of some other drive, or of a network drive.version (Windows) { assert (isRooted(`\`)); assert (isRooted(`\foo`)); assert (isRooted(`d:\foo`)); assert (isRooted(`\\foo\bar`)); assert (!isRooted("foo")); assert (!isRooted("d:foo")); }
- pure nothrow @safe bool
isAbsolute
(R)(Rpath
)
if (isRandomAccessRange!R && isSomeChar!(ElementType!R) || is(StringTypeOf!R)); - Determines whether a
path
is absolute or not.Parameters:R path
A path
name.Returns:Whether apath
is absolute or not.Example: On POSIX, an absolute
path
starts at the root directory. (In fact, isAbsolute is just an alias for isRooted.)version (Posix) { assert (isAbsolute("/")); assert (isAbsolute("/foo")); assert (!isAbsolute("foo")); assert (!isAbsolute("../foo")); }
On Windows, an absolutepath
starts at the root directory of a specific drive. Hence, it must start with d:\ or d:/, where d is the drive letter. Alternatively, it may be a networkpath
, i.e. apath
starting with a double (back)slash.version (Windows) { assert (isAbsolute(`d:\`)); assert (isAbsolute(`d:\foo`)); assert (isAbsolute(`\\foo\bar`)); assert (!isAbsolute(`\`)); assert (!isAbsolute(`\foo`)); assert (!isAbsolute("d:foo")); }
- pure @safe string
absolutePath
(stringpath
, lazy stringbase
= getcwd()); - Transforms
path
into an absolute path.The following algorithm is used:- If
path
is empty, returnnull
. - If
path
is already absolute, return it. - Otherwise, append
path
tobase
and return the result. Ifbase
is not specified, the current working directory is used.
Parameters:string path
the relative path
to transformstring base
the base
directory of the relativepath
Returns:string of transformedpath
Throws:Exception if the specified base directory is not absolute.See Also:asAbsolutePath which does not allocateExamples:version (Posix) { assert (absolutePath("some/file", "/foo/bar") == "/foo/bar/some/file"); assert (absolutePath("../file", "/foo/bar") == "/foo/bar/../file"); assert (absolutePath("/some/file", "/foo/bar") == "/some/file"); } version (Windows) { assert (absolutePath(`some\file`, `c:\foo\bar`) == `c:\foo\bar\some\file`); assert (absolutePath(`..\file`, `c:\foo\bar`) == `c:\foo\bar\..\file`); assert (absolutePath(`c:\some\file`, `c:\foo\bar`) == `c:\some\file`); assert (absolutePath(`\`, `c:\`) == `c:\`); assert (absolutePath(`\some\file`, `c:\foo\bar`) == `c:\some\file`); }
- If
- auto
asAbsolutePath
(R)(Rpath
)
if ((isRandomAccessRange!R && isSomeChar!(ElementType!R) || isNarrowString!R) && !isConvertibleToString!R); - Transforms
path
into an absolute path.The following algorithm is used:- If
path
is empty, returnnull
. - If
path
is already absolute, return it. - Otherwise, append
path
to the current working directory, which allocates memory.
Parameters:R path
the relative path
to transformReturns:the transformedpath
as a lazy rangeSee Also:absolutePath which returns an allocated stringExamples:import std.array; assert(asAbsolutePath(cast(string)null).array == ""); version (Posix) { assert(asAbsolutePath("/foo").array == "/foo"); } version (Windows) { assert(asAbsolutePath("c:/foo").array == "c:/foo"); } asAbsolutePath("foo");
- If
- string
relativePath
(CaseSensitive cs = CaseSensitive.osDefault)(stringpath
, lazy stringbase
= getcwd()); - Translates
path
into a relative path.The returned path is relative tobase
, which is by default taken to be the current working directory. If specified,base
must be an absolute path, and it is always assumed to refer to a directory. Ifpath
andbase
refer to the same directory, the function returns .. The following algorithm is used:- If
path
is a relative directory, return it unaltered. - Find a common root between
path
andbase
. If there is no common root, returnpath
unaltered. - Prepare a string with as many ../ or ..\ as
necessary to reach the common root from
base
path
. - Append the remaining segments of
path
to the string and return.
path
components are compared using filenameCmp!cs, where cs is an optional template parameter determining whether the comparison is case sensitive or not. See the filenameCmp documentation for details. This function allocates memory.Parameters:cs Whether matching path
name components against thebase
path
should be case-sensitive or not.string path
A path
name.string base
The base
path
to construct the relativepath
from.Returns:The relativepath
.See Also:asRelativePath which does not allocate memoryThrows:Exception if the specified base directory is not absolute.Examples:assert (relativePath("foo") == "foo"); version (Posix) { assert (relativePath("foo", "/bar") == "foo"); assert (relativePath("/foo/bar", "/foo/bar") == "."); assert (relativePath("/foo/bar", "/foo/baz") == "../bar"); assert (relativePath("/foo/bar/baz", "/foo/woo/wee") == "../../bar/baz"); assert (relativePath("/foo/bar/baz", "/foo/bar") == "baz"); } version (Windows) { assert (relativePath("foo", `c:\bar`) == "foo"); assert (relativePath(`c:\foo\bar`, `c:\foo\bar`) == "."); assert (relativePath(`c:\foo\bar`, `c:\foo\baz`) == `..\bar`); assert (relativePath(`c:\foo\bar\baz`, `c:\foo\woo\wee`) == `..\..\bar\baz`); assert (relativePath(`c:\foo\bar\baz`, `c:\foo\bar`) == "baz"); assert (relativePath(`c:\foo\bar`, `d:\foo`) == `c:\foo\bar`); }
- If
- auto
asRelativePath
(CaseSensitive cs = CaseSensitive.osDefault, R1, R2)(R1path
, R2base
)
if ((isNarrowString!R1 || isRandomAccessRange!R1 && hasSlicing!R1 && isSomeChar!(ElementType!R1) && !isConvertibleToString!R1) && (isNarrowString!R2 || isRandomAccessRange!R2 && hasSlicing!R2 && isSomeChar!(ElementType!R2) && !isConvertibleToString!R2)); - Transforms
path
into a path relative tobase
.The returned path is relative tobase
, which is usually the current working directory.base
must be an absolute path, and it is always assumed to refer to a directory. Ifpath
andbase
refer to the same directory, the function returns '.'. The following algorithm is used:- If
path
is a relative directory, return it unaltered. - Find a common root between
path
andbase
. If there is no common root, returnpath
unaltered. - Prepare a string with as many ../ or ..\ as
necessary to reach the common root from
base
path
. - Append the remaining segments of
path
to the string and return.
path
components are compared using filenameCmp!cs, where cs is an optional template parameter determining whether the comparison is case sensitive or not. See the filenameCmp documentation for details.Parameters:R1 path
path to transform R2 base
absolute path
cs whether filespec comparisons are sensitive or not; defaults to CaseSensitive.osDefault Returns:a random access range of the transformed pathSee Also:Examples:import std.array; version (Posix) { assert (asRelativePath("foo", "/bar").array == "foo"); assert (asRelativePath("/foo/bar", "/foo/bar").array == "."); assert (asRelativePath("/foo/bar", "/foo/baz").array == "../bar"); assert (asRelativePath("/foo/bar/baz", "/foo/woo/wee").array == "../../bar/baz"); assert (asRelativePath("/foo/bar/baz", "/foo/bar").array == "baz"); } else version (Windows) { assert (asRelativePath("foo", `c:\bar`).array == "foo"); assert (asRelativePath(`c:\foo\bar`, `c:\foo\bar`).array == "."); assert (asRelativePath(`c:\foo\bar`, `c:\foo\baz`).array == `..\bar`); assert (asRelativePath(`c:\foo\bar\baz`, `c:\foo\woo\wee`).array == `..\..\bar\baz`); assert (asRelativePath(`c:/foo/bar/baz`, `c:\foo\woo\wee`).array == `..\..\bar\baz`); assert (asRelativePath(`c:\foo\bar\baz`, `c:\foo\bar`).array == "baz"); assert (asRelativePath(`c:\foo\bar`, `d:\foo`).array == `c:\foo\bar`); assert (asRelativePath(`\\foo\bar`, `c:\foo`).array == `\\foo\bar`); } else static assert(0);
- If
- pure nothrow @safe int
filenameCharCmp
(CaseSensitive cs = CaseSensitive.osDefault)(dchara
, dcharb
); - Compares filename characters.This function can perform
a
case-sensitive ora
case-insensitive comparison. This is controlled through the cs template parameter which, if not specified, is given by CaseSensitive.osDefault. On Windows, the backslash and slash characters (\ and /) are considered equal.Parameters:cs Case-sensitivity of the comparison. dchar a
A filename character. dchar b
A filename character. Returns:< 0 ifa
<b
, 0 ifa
==b
, and > 0 ifa
>b
.Examples:assert (filenameCharCmp('a', 'a') == 0); assert (filenameCharCmp('a', 'b') < 0); assert (filenameCharCmp('b', 'a') > 0); version (linux) { // Same as calling filenameCharCmp!(CaseSensitive.yes)(a, b) assert (filenameCharCmp('A', 'a') < 0); assert (filenameCharCmp('a', 'A') > 0); } version (Windows) { // Same as calling filenameCharCmp!(CaseSensitive.no)(a, b) assert (filenameCharCmp('a', 'A') == 0); assert (filenameCharCmp('a', 'B') < 0); assert (filenameCharCmp('A', 'b') < 0); }
- int
filenameCmp
(CaseSensitive cs = CaseSensitive.osDefault, Range1, Range2)(Range1filename1
, Range2filename2
)
if (isInputRange!Range1 && isSomeChar!(ElementEncodingType!Range1) && !isConvertibleToString!Range1 && isInputRange!Range2 && isSomeChar!(ElementEncodingType!Range2) && !isConvertibleToString!Range2); - Compares file names and returnsIndividual characters are compared using filenameCharCmp!cs, where cs is an optional template parameter determining whether the comparison is case sensitive or not. Treatment of invalid UTF encodings is implementation defined.Parameters:
cs case sensitivity Range1 filename1
range for first file name Range2 filename2
range for second file name Returns:< 0 iffilename1
<filename2
, 0 iffilename1
==filename2
and > 0 iffilename1
>filename2
.See Also:Examples:assert (filenameCmp("abc", "abc") == 0); assert (filenameCmp("abc", "abd") < 0); assert (filenameCmp("abc", "abb") > 0); assert (filenameCmp("abc", "abcd") < 0); assert (filenameCmp("abcd", "abc") > 0); version (linux) { // Same as calling filenameCmp!(CaseSensitive.yes)(filename1, filename2) assert (filenameCmp("Abc", "abc") < 0); assert (filenameCmp("abc", "Abc") > 0); } version (Windows) { // Same as calling filenameCmp!(CaseSensitive.no)(filename1, filename2) assert (filenameCmp("Abc", "abc") == 0); assert (filenameCmp("abc", "Abc") == 0); assert (filenameCmp("Abc", "abD") < 0); assert (filenameCmp("abc", "AbB") > 0); }
- pure nothrow @safe bool
globMatch
(CaseSensitive cs = CaseSensitive.osDefault, C, Range)(Rangepath
, const(C)[]pattern
)
if (isForwardRange!Range && isSomeChar!(ElementEncodingType!Range) && !isConvertibleToString!Range && isSomeChar!C && is(Unqual!C == Unqual!(ElementEncodingType!Range))); - Matches a
pattern
against apath
.Some characters ofpattern
have a special meaning (they are meta-characters) and can't be escaped. These are:
Individual characters are compared using filenameCharCmp!cs, where cs is an optional template parameter determining whether the comparison is case sensitive or not. See the filenameCharCmp documentation for details. Note that directory separators and dots don't stop a meta-character from matching further portions of the* Matches 0 or more instances of any character. ? Matches exactly one instance of any character. [chars] Matches one instance of any character that appears between the brackets. [!chars] Matches one instance of any character that does not appear between the brackets after the exclamation mark. {string1,string2,…} Matches either of the specified strings. path
.Parameters:cs Whether the matching should be case-sensitive Range path
The path
to be matched againstconst(C)[] pattern
The glob pattern
Returns:true
ifpattern
matchespath
,false
otherwise.See Also:Examples:assert (globMatch("foo.bar", "*")); assert (globMatch("foo.bar", "*.*")); assert (globMatch(`foo/foo\bar`, "f*b*r")); assert (globMatch("foo.bar", "f???bar")); assert (globMatch("foo.bar", "[fg]???bar")); assert (globMatch("foo.bar", "[!gh]*bar")); assert (globMatch("bar.fooz", "bar.{foo,bif}z")); assert (globMatch("bar.bifz", "bar.{foo,bif}z")); version (Windows) { // Same as calling globMatch!(CaseSensitive.no)(path, pattern) assert (globMatch("foo", "Foo")); assert (globMatch("Goo.bar", "[fg]???bar")); } version (linux) { // Same as calling globMatch!(CaseSensitive.yes)(path, pattern) assert (!globMatch("foo", "Foo")); assert (!globMatch("Goo.bar", "[fg]???bar")); }
- bool
isValidFilename
(Range)(Rangefilename
)
if ((isRandomAccessRange!Range && hasLength!Range && hasSlicing!Range && isSomeChar!(ElementEncodingType!Range) || isNarrowString!Range) && !isConvertibleToString!Range); - Checks that the given file or directory name is valid.The maximum length of
filename
is given by the constant core.stdc.stdio.FILENAME_MAX. (On Windows, this number is defined as the maximum number of UTF-16 code points, and the test will therefore only yield strictly correct results whenfilename
is a string of wchars.) On Windows, the following criteria must be satisfied (source):filename
must not contain any characters whose integer representation is in the range 0-31.filename
must not contain any of the following reserved characters: <>:"/\|?*filename
may not end with a space (' ') or a period ('.').
filename
may not contain a forward slash ('/') or thenull
character ('\0').Parameters:Range filename
string to check Returns:true
if and only iffilename
is not empty, not too long, and does not contain invalid characters.Examples:import std.utf : byCodeUnit; assert(isValidFilename("hello.exe".byCodeUnit));
- bool
isValidPath
(Range)(Rangepath
)
if ((isRandomAccessRange!Range && hasLength!Range && hasSlicing!Range && isSomeChar!(ElementEncodingType!Range) || isNarrowString!Range) && !isConvertibleToString!Range); - Checks whether
path
is a valid path.Generally, this function checks thatpath
is not empty, and that each component of thepath
either satisfies isValidFilename or is equal to "." or "..". It does not check whether the path points to an existing file or directory; use std.file.exists for this purpose. On Windows, some special rules apply:- If the second character of
path
is a colon (':'), the first character is interpreted as a drive letter, and must be in the range A-Z (case insensitive). - If
path
is on the form \\server\share\... (UNCpath
), isValidFilename is applied to server and share as well. - If
path
starts with \\?\ (long UNCpath
), the only requirement for the rest of the string is that it does not contain thenull
character. - If
path
starts with \\.\ (Win32 device namespace) this function returnsfalse
; such paths are beyond the scope of this module.
Parameters:Range path
string or Range of characters to check Returns:true
ifpath
is a valid path.Examples:assert (isValidPath("/foo/bar")); assert (!isValidPath("/foo\0/bar")); assert (isValidPath("/")); assert (isValidPath("a")); version (Windows) { assert (isValidPath(`c:\`)); assert (isValidPath(`c:\foo`)); assert (isValidPath(`c:\foo\.\bar\\\..\`)); assert (!isValidPath(`!:\foo`)); assert (!isValidPath(`c::\foo`)); assert (!isValidPath(`c:\foo?`)); assert (!isValidPath(`c:\foo.`)); assert (isValidPath(`\\server\share`)); assert (isValidPath(`\\server\share\foo`)); assert (isValidPath(`\\server\share\\foo`)); assert (!isValidPath(`\\\server\share\foo`)); assert (!isValidPath(`\\server\\share\foo`)); assert (!isValidPath(`\\ser*er\share\foo`)); assert (!isValidPath(`\\server\sha?e\foo`)); assert (!isValidPath(`\\server\share\|oo`)); assert (isValidPath(`\\?\<>:"?*|/\..\.`)); assert (!isValidPath("\\\\?\\foo\0bar")); assert (!isValidPath(`\\.\PhysicalDisk1`)); assert (!isValidPath(`\\`)); } import std.utf : byCodeUnit; assert (isValidPath("/foo/bar".byCodeUnit));
- If the second character of
- nothrow string
expandTilde
(stringinputPath
); - Performs tilde expansion in paths on POSIX systems. On Windows, this function does nothing.There are two ways of using tilde expansion in a path. One involves using the tilde alone or followed by a path separator. In this case, the tilde will be expanded with the value of the environment variable HOME. The second way is putting a username after the tilde (i.e. ~john/Mail). Here, the username will be searched for in the user database (i.e. /etc/passwd on Unix systems) and will expand to whatever path is stored there. The username is considered the string after the tilde ending at the first instance of a path separator. Note that using the ~user syntax may give different values from just ~ if the environment variable doesn't match the value stored in the user database. When the environment variable version is used, the path won't be modified if the environment variable doesn't exist or it is empty. When the database version is used, the path won't be modified if the user doesn't exist in the database or there is not enough memory to perform the query. This function performs several memory allocations.Parameters:
string inputPath
The path name to expand. Returns:inputPath
with the tilde expanded, or justinputPath
if it could not be expanded. For Windows,expandTilde
merely returns its argumentinputPath
.Example:
void processFile(string path) { // Allow calling this function with paths such as ~/foo auto fullPath = expandTilde(path); ... }