ReadEnvEffect = object of ReadIOEffect
WriteEnvEffect = object of WriteIOEffect
ReadDirEffect = object of ReadIOEffect
WriteDirEffect = object of WriteIOEffect
OSErrorCode = distinct int32
doslikeFileSystem = true
CurDir = '.'
The constant string used by the operating system to refer to the current directory.
For example: '.' for POSIX or ':' for the classic Macintosh.
ParDir = ".."
The constant string used by the operating system to refer to the parent directory.
For example: ".." for POSIX or "::" for the classic Macintosh.
DirSep = '/'
AltSep = '/'
PathSep = ':'
FileSystemCaseSensitive = true
ExeExt = ""
ScriptExt = ""
DynlibFormat = "lib$1.so"
ExtSep = '.'
os.nim
. proc joinPath(head, tail: string): string {...}{.noSideEffect, gcsafe, extern: "nos$1", raises: [], tags: [].}
Joins two directory names to one.
For example on Unix:
joinPath("usr", "lib")
results in:
"usr/lib"
If head is the empty string, tail is returned. If tail is the empty string, head is returned with a trailing path separator. If tail starts with a path separator it will be removed when concatenated to head. Other path separators not located on boundaries won't be modified. More examples on Unix:
assert joinPath("usr", "") == "usr/" assert joinPath("", "lib") == "lib" assert joinPath("", "/lib") == "/lib" assert joinPath("usr/", "/lib") == "usr/lib"
proc joinPath(parts: varargs[string]): string {...}{.noSideEffect, gcsafe, extern: "nos$1OpenArray", raises: [], tags: [].}
proc `/`(head, tail: string): string {...}{.noSideEffect, raises: [], tags: [].}
The same as joinPath(head, tail)
Here are some examples for Unix:
assert "usr" / "" == "usr/" assert "" / "lib" == "lib" assert "" / "/lib" == "/lib" assert "usr/" / "/lib" == "usr/lib"
proc splitPath(path: string): tuple[head, tail: string] {...}{.noSideEffect, gcsafe, extern: "nos$1", raises: [], tags: [].}
Splits a directory into (head, tail), so that head / tail == path
(except for edge cases like "/usr").
Examples:
splitPath("usr/local/bin") -> ("usr/local", "bin") splitPath("usr/local/bin/") -> ("usr/local/bin", "") splitPath("bin") -> ("", "bin") splitPath("/bin") -> ("", "bin") splitPath("") -> ("", "")
proc parentDir(path: string): string {...}{.noSideEffect, gcsafe, extern: "nos$1", raises: [], tags: [].}
Returns the parent directory of path.
This is often the same as the head
result of splitPath
. If there is no parent, "" is returned.
Example: parentDir("/usr/local/bin") == "/usr/local"
.
Example: parentDir("/usr/local/bin/") == "/usr/local"
.
proc tailDir(path: string): string {...}{.noSideEffect, gcsafe, extern: "nos$1", raises: [], tags: [].}
Example: tailDir("/usr/local/bin") == "local/bin"
.
Example: tailDir("usr/local/bin/") == "local/bin"
.
Example: tailDir("bin") == ""
.
proc isRootDir(path: string): bool {...}{.noSideEffect, gcsafe, extern: "nos$1", raises: [], tags: [].}
proc `/../`(head, tail: string): string {...}{.noSideEffect, raises: [], tags: [].}
parentDir(head) / tail
unless there is no parent directory. Then head / tail
is performed instead. proc searchExtPos(path: string): int {...}{.raises: [], tags: [].}
proc splitFile(path: string): tuple[dir, name, ext: string] {...}{.noSideEffect, gcsafe, extern: "nos$1", raises: [], tags: [].}
Splits a filename into (dir, filename, extension). dir does not end in DirSep. extension includes the leading dot.
Example:
var (dir, name, ext) = splitFile("usr/local/nimc.html") assert dir == "usr/local" assert name == "nimc" assert ext == ".html"
If path has no extension, ext is the empty string. If path has no directory component, dir is the empty string. If path has no filename component, name and ext are empty strings.
proc extractFilename(path: string): string {...}{.noSideEffect, gcsafe, extern: "nos$1", raises: [], tags: [].}
name & ext
from splitFile(path)
. proc changeFileExt(filename, ext: string): string {...}{.noSideEffect, gcsafe, extern: "nos$1", raises: [], tags: [].}
Changes the file extension to ext.
If the filename has no extension, ext will be added. If ext == "" then any extension is removed. Ext should be given without the leading '.', because some filesystems may use a different character. (Although I know of none such beast.)
proc addFileExt(filename, ext: string): string {...}{.noSideEffect, gcsafe, extern: "nos$1", raises: [], tags: [].}
Adds the file extension ext to filename, unless filename already has an extension.
Ext should be given without the leading '.', because some filesystems may use a different character. (Although I know of none such beast.)
proc cmpPaths(pathA, pathB: string): int {...}{.noSideEffect, gcsafe, extern: "nos$1", raises: [], tags: [].}
Compares two paths.
On a case-sensitive filesystem this is done case-sensitively otherwise case-insensitively. Returns:
0 iff pathA == pathB
< 0 iff pathA < pathB
> 0 iff pathA > pathB
Examples:
when defined(macosx): doAssert cmpPaths("foo", "Foo") == 0 elif defined(posix): doAssert cmpPaths("foo", "Foo") > 0
proc isAbsolute(path: string): bool {...}{.gcsafe, noSideEffect, extern: "nos$1", raises: [], tags: [].}
Checks whether a given path is absolute.
On Windows, network paths are considered absolute too.
Examples:
doAssert(not "".isAbsolute) doAssert(not ".".isAbsolute) when defined(posix): doAssert "/".isAbsolute doAssert(not "a/".isAbsolute)
proc unixToNativePath(path: string; drive = ""): string {...}{.noSideEffect, gcsafe, extern: "nos$1", raises: [], tags: [].}
Converts an UNIX-like path to a native one.
On an UNIX system this does nothing. Else it converts '/', '.', '..' to the appropriate things.
On systems with a concept of "drives", drive is used to determine which drive label to use during absolute path conversion. drive defaults to the drive of the current working directory, and is ignored on systems that do not have a concept of "drives".
proc getHomeDir(): string {...}{.gcsafe, extern: "nos$1", tags: [ReadEnvEffect, ReadIOEffect], raises: [].}
Returns the home directory of the current user.
This proc is wrapped by the expandTilde proc for the convenience of processing paths coming from user configuration files.
proc getConfigDir(): string {...}{.gcsafe, extern: "nos$1", tags: [ReadEnvEffect, ReadIOEffect], raises: [].}
Returns the config directory of the current user for applications.
On non-Windows OSs, this proc conforms to the XDG Base Directory spec. Thus, this proc returns the value of the XDG_CONFIG_HOME environment variable if it is set, and returns the default configuration directory, "~/.config/", otherwise.
An OS-dependent trailing slash is always present at the end of the returned string; ` on Windows and `/ on all other OSs.
proc getTempDir(): string {...}{.gcsafe, extern: "nos$1", tags: [ReadEnvEffect, ReadIOEffect], raises: [].}
Returns the temporary directory of the current user for applications to save temporary files in.
Please do not use this: On Android, it currently returns getHomeDir()
, and on other Unix based systems it can cause security problems too. That said, you can override this implementation by adding -d:tempDir=mytempname
to your compiler invokation.
proc expandTilde(path: string): string {...}{.tags: [ReadEnvEffect, ReadIOEffect], raises: [].}
Expands ~
or a path starting with ~/
to a full path, replacing ~
with getHomeDir()
(otherwise returns path
unmodified).
Windows: this is still supported despite Windows platform not having this convention; also, both ~/
and ~\
are handled.
Examples:
doAssert expandTilde("~" / "appname.cfg") == getHomeDir() / "appname.cfg"
proc quoteShellWindows(s: string): string {...}{.noSideEffect, gcsafe, extern: "nosp$1", raises: [], tags: [].}
proc quoteShellPosix(s: string): string {...}{.noSideEffect, gcsafe, extern: "nosp$1", raises: [], tags: [].}
s
, so it can be safely passed to POSIX shell. Based on Python's pipes.quote proc quoteShell(s: string): string {...}{.noSideEffect, gcsafe, extern: "nosp$1", raises: [], tags: [].}
s
, so it can be safely passed to shell. proc quoteShellCommand(args: openArray[string]): string {...}{.raises: [], tags: [].}
Examples:
when defined(posix): assert quoteShellCommand(["aaa", "", "c d"]) == "aaa \'\' \'c d\'" when defined(windows): assert quoteShellCommand(["aaa", "", "c d"]) == "aaa \"\" \"c d\""
iterator parentDirs(path: string; fromRoot = false; inclusive = true): string {...}{. raises: [], tags: [].}
Walks over all parent directories of a given path
If fromRoot is set, the traversal will start from the file system root diretory. If inclusive is set, the original argument will be included in the traversal.
Relative paths won't be expanded by this proc. Instead, it will traverse only the directories appearing in the relative path.
© 2006–2018 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/ospaths.html