Spec-Zone.ru › Nim 1

os

Этот модуль содержит базовые функции операционной системы, такие как извлечение переменных среды, чтение аргументов командной строки, работа с каталогами, выполнение команд оболочки и т.д.

import os

let myFile = "/path/to/my/file.nim"

let pathSplit = splitPath(myFile)
assert pathSplit.head == "/path/to/my"
assert pathSplit.tail == "file.nim"

assert parentDir(myFile) == "/path/to/my"

let fileSplit = splitFile(myFile)
assert fileSplit.dir == "/path/to/my"
assert fileSplit.name == "file"
assert fileSplit.ext == ".nim"

assert myFile.changeFileExt("c") == "/path/to/my/file.c"

См. также:

  • модуль osproc для межпроцессного взаимодействия, выходящего за рамки execShellCmd proc
  • модуль parseopt для парсера командной строки, выходящего за рамки parseCmdLine proc
  • модуль uri
  • модуль distros
  • модуль dynlib
  • модуль streams

Импорты

since, strutils, pathnorm, posix, times

Типы

ReadEnvEffect = object of ReadIOEffect
Эффект, обозначающий чтение из переменной среды. Исходный код Редактировать
WriteEnvEffect = object of WriteIOEffect
Эффект, обозначающий запись в переменную среды. Исходный код Редактировать
ReadDirEffect = object of ReadIOEffect
Эффект, обозначающий операцию чтения из структуры каталогов. Исходный код Редактировать
WriteDirEffect = object of WriteIOEffect
Эффект, обозначающий операцию записи в структуру каталогов. Исходный код Редактировать
OSErrorCode = distinct int32
Указывает код ошибки ОС. Исходный код Редактировать
FilePermission = enum
  fpUserExec,               ## execute access for the file owner
  fpUserWrite,              ## write access for the file owner
  fpUserRead,               ## read access for the file owner
  fpGroupExec,              ## execute access for the group
  fpGroupWrite,             ## write access for the group
  fpGroupRead,              ## read access for the group
  fpOthersExec,             ## execute access for others
  fpOthersWrite,            ## write access for others
  fpOthersRead               ## read access for others

Разрешения доступа к файлам, смоделированные по UNIX.

См. также:

  • getFilePermissions
  • setFilePermissions
  • объект FileInfo
Исходный код Редактировать
PathComponent = enum
  pcFile,                   ## path refers to a file
  pcLinkToFile,             ## path refers to a symbolic link to a file
  pcDir,                    ## path refers to a directory
  pcLinkToDir                ## path refers to a symbolic link to a directory

Перечисление, определяющее компонент пути.

См. также:

  • итератор walkDirRec
  • объект FileInfo
Исходный код Редактировать
DeviceId = Dev
Исходный код Редактировать
FileId = Ino
Исходный код Редактировать
FileInfo = object
  id*: tuple[device: DeviceId, file: FileId] ## Device and file id.
  kind*: PathComponent       ## Kind of file object - directory, symlink, etc.
  size*: BiggestInt          ## Size of file.
  permissions*: set[FilePermission] ## File permissions
  linkCount*: BiggestInt     ## Number of hard links the file object has.
  lastAccessTime*: times.Time ## Time file was last accessed.
  lastWriteTime*: times.Time ## Time file was last modified/written to.
  creationTime*: times.Time  ## Time file was created. Not supported on all systems!

Содержит информацию, связанную с объектом файла.

См. также:

  • getFileInfo(handle) proc
  • getFileInfo(file) proc
  • getFileInfo(path) proc
Исходный код Редактировать

Константы

invalidFilenameChars = {'/', '\\', ':', '*', '?', '\"', '<', '>', '|', '^',
                        '\x00'}
Символы, которые могут создавать недопустимые имена файлов в Linux, Windows, macOS и т.д. Можно проверить, содержит ли имя файла эти символы и удалить их для безопасности. macOS запрещает ':', Linux запрещает '/', а Windows запрещает все остальные. Исходный код Редактировать
invalidFilenames = ["CON", "PRN", "AUX", "NUL", "COM0", "COM1", "COM2", "COM3",
                    "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", "LPT0",
                    "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7",
                    "LPT8", "LPT9"]
Имена файлов, которые могут быть недопустимыми в Linux, Windows, macOS и т.д. Можно проверить, соответствует ли имя файла этим именам и переименовать его для безопасности (в настоящее время все недопустимые имена файлов только из Windows). Исходный код Редактировать
doslikeFileSystem = false
Исходный код Редактировать
CurDir = '.'

Символ, используемый операционной системой для обозначения текущего каталога.

Например: '.' для POSIX или ':' для классического Macintosh.

Исходный код Редактировать
ParDir = ".."

Строка, используемая операционной системой для обозначения родительского каталога.

Например: ".." для POSIX или "::" для классического Macintosh.

Исходный код Редактировать
DirSep = '/'
Символ, используемый операционной системой для разделения компонентов пути, например: '/' для POSIX, ':' для классического Macintosh и '\' в Windows. Исходный код Редактировать
AltSep = '/'
Альтернативный символ, используемый операционной системой для разделения компонентов пути, или такой же, как DirSep, если существует только один разделитель. Он настроен на '/' в системах Windows, где DirSep — обратный слэш ('\'). Исходный код Редактировать
PathSep = ':'
Символ, обычно используемый операционной системой для разделения компонентов пути поиска (например, PATH), такой как ':' для POSIX или ';' для Windows. Исходный код Редактировать
FileSystemCaseSensitive = true
True, если файловая система регистрозависимая, false в противном случае. Используется процедурой cmpPaths proc для правильного сравнения имён файлов. Исходный код Редактировать
ExeExt = ""
Расширение имени файла для исполняемых файлов. Например: "" для POSIX, "exe" в Windows (без точки). Исходный код Редактировать
ScriptExt = ""
Расширение имени файла для скрипта. Например: "" для POSIX, "bat" в Windows. Исходный код Редактировать
DynlibFormat = "lib$1.so"
Строковый формат для преобразования имени файла в файл DLL (также называемый общим объектом на некоторых операционных системах). Исходный код Редактировать
ExtSep = '.'
Символ, разделяющий имя файла и расширение, например, '.' в os.nim. Исходный код Редактировать
ExeExts = [""]
Платформозависимое расширение для исполняемых файлов. В Windows ["exe", "cmd", "bat"], в Posix [""]. Исходный код Редактировать

Процедуры

proc normalizePathEnd(path: var string; trailingSep = false) {...}{.raises: [],
    tags: [].}
Обеспечивает, что path имеет ровно 0 или 1 конечный DirSep, в зависимости от trailingSep, и учитывает граничные случаи: сохраняет, является ли путь абсолютным или относительным, и гарантирует, что конечный разделитель DirSep, а не AltSep. Конечные /. сжимаются, см. примеры. Исходный код Редактировать
proc normalizePathEnd(path: string; trailingSep = false): string {...}{.raises: [],
    tags: [].}
Перегрузка outplace

Пример:

when defined(posix):
  assert normalizePathEnd("/lib//.//", trailingSep = true) == "/lib/"
  assert normalizePathEnd("lib/./.", trailingSep = false) == "lib"
  assert normalizePathEnd(".//./.", trailingSep = false) == "."
  assert normalizePathEnd("", trailingSep = true) == "" # not / !
  assert normalizePathEnd("/", trailingSep = false) == "/" # not "" !
Исходный код Редактировать
proc joinPath(head, tail: string): string {...}{.noSideEffect, gcsafe,
    extern: "nos$1", raises: [], tags: [].}

Объединяет два имени каталогов в одно.

возвращает нормализованное конкатенацию пути head и tail, сохраняя, имеет ли tail конечный слэш (или, если tail пусто, имеет ли head один).

См. также:

  • joinPath(varargs) proc
  • / proc
  • splitPath proc
  • uri.combine proc
  • uri./ proc

Пример:

when defined(posix):
  assert joinPath("usr", "lib") == "usr/lib"
  assert joinPath("usr", "lib/") == "usr/lib/"
  assert joinPath("usr", "") == "usr"
  assert joinPath("usr/", "") == "usr/"
  assert joinPath("", "") == ""
  assert joinPath("", "lib") == "lib"
  assert joinPath("", "/lib") == "/lib"
  assert joinPath("usr/", "/lib") == "usr/lib"
  assert joinPath("usr/lib", "../bin") == "usr/bin"
Исходный код Редактировать
proc joinPath(parts: varargs[string]): string {...}{.noSideEffect, gcsafe,
    extern: "nos$1OpenArray", raises: [], tags: [].}

То же самое, что и joinPath(head, tail) proc, но работает с любым количеством частей каталога.

Вам нужно передать как минимум один элемент, иначе процедура будет утверждать при отладке и аварийно завершаться при релизной сборке.

См. также:

  • joinPath(head, tail) proc
  • / proc
  • /../ proc
  • splitPath proc

Пример:

when defined(posix):
  assert joinPath("a") == "a"
  assert joinPath("a", "b", "c") == "a/b/c"
  assert joinPath("usr/lib", "../../var", "log") == "var/log"
Исходный код Редактировать
proc `/`(head, tail: string): string {...}{.noSideEffect, raises: [], tags: [].}

То же самое, что и joinPath(head, tail) proc.

См. также:

  • /../ proc
  • joinPath(head, tail) proc
  • joinPath(varargs) proc
  • splitPath proc
  • uri.combine proc
  • uri./ proc

Пример:

when defined(posix):
  assert "usr" / "" == "usr"
  assert "" / "lib" == "lib"
  assert "" / "/lib" == "/lib"
  assert "usr/" / "/lib/" == "usr/lib/"
  assert "usr" / "lib" / "../bin" == "usr/bin"
Исходный код Редактировать
proc splitPath(path: string): tuple[head, tail: string] {...}{.noSideEffect, gcsafe,
    extern: "nos$1", raises: [], tags: [].}

Разделяет каталог на (head, tail) кортеж, так что head / tail == path (за исключением граничных случаев, таких как "/usr").

См. также:

  • joinPath(head, tail) proc
  • joinPath(varargs) proc
  • / proc
  • /../ proc
  • relativePath proc

Пример:

assert splitPath("usr/local/bin") == ("usr/local", "bin")
assert splitPath("usr/local/bin/") == ("usr/local/bin", "")
assert splitPath("/bin/") == ("/bin", "")
when (NimMajor, NimMinor) <= (1, 0):
  assert splitPath("/bin") == ("", "bin")
else:
  assert splitPath("/bin") == ("/", "bin")
assert splitPath("bin") == ("", "bin")
assert splitPath("") == ("", "")
Исходный код Редактировать
proc isAbsolute(path: string): bool {...}{.gcsafe, noSideEffect, extern: "nos$1",
                                      raises: [], tags: [].}

Проверяет, является ли заданный path абсолютным.

В Windows сетевые пути также считаются абсолютными.

Пример:

assert not "".isAbsolute
assert not ".".isAbsolute
when defined(posix):
  assert "/".isAbsolute
  assert not "a/".isAbsolute
  assert "/a/".isAbsolute
Исходный код Редактировать
proc relativePath(path, base: string; sep = DirSep): string {...}{.gcsafe,
    extern: "nos$1", raises: [Exception], tags: [RootEffect].}

Преобразует path в путь, относительный к base.

Используется sep (по умолчанию: DirSep) для нормализации путей, это может быть полезно для обеспечения того, что относительный путь содержит только '/', чтобы он мог использоваться для построения URL.

В Windows, если корень path и корень base различны, возвращает path как есть, так как невозможно создать относительный путь. Это означает, что может быть возвращён абсолютный путь.

См. также:

  • splitPath proc
  • parentDir proc
  • tailDir proc

Пример:

assert relativePath("/Users/me/bar/z.nim", "/Users/other/bad", '/') == "../../me/bar/z.nim"
assert relativePath("/Users/me/bar/z.nim", "/Users/other", '/') == "../me/bar/z.nim"
assert relativePath("/Users///me/bar//z.nim", "//Users/", '/') == "me/bar/z.nim"
assert relativePath("/Users/me/bar/z.nim", "/Users/me", '/') == "bar/z.nim"
assert relativePath("", "/users/moo", '/') == ""
assert relativePath("foo", ".", '/') == "foo"
assert relativePath("foo", "foo", '/') == "."
Исходный код Редактировать
proc isRelativeTo(path: string; base: string): bool {...}{.raises: [Exception],
    tags: [RootEffect].}
Возвращает true, если path является относительным к base.

Пример:

doAssert isRelativeTo("./foo//bar", "foo")
doAssert isRelativeTo("foo/bar", ".")
doAssert isRelativeTo("/foo/bar.nim", "/foo/bar.nim")
doAssert not isRelativeTo("foo/bar.nims", "foo/bar.nim")
Исходный код Редактировать
proc parentDir(path: string): string {...}{.noSideEffect, gcsafe, extern: "nos$1",
                                       raises: [], tags: [].}

Возвращает родительский каталог path.

Это аналогично splitPath(path).head, когда path не заканчивается разделителем каталога, но также учитывает нормализацию пути. Остаток можно получить с помощью lastPathPart(path) proc.

См. также:

  • relativePath proc
  • splitPath proc
  • tailDir proc
  • parentDirs iterator

Пример:

assert parentDir("") == ""
when defined(posix):
  assert parentDir("/usr/local/bin") == "/usr/local"
  assert parentDir("foo/bar//") == "foo"
  assert parentDir("//foo//bar//.") == "/foo"
  assert parentDir("./foo") == "."
  assert parentDir("/./foo//./") == "/"
  assert parentDir("a//./") == "."
  assert parentDir("a/b/c/..") == "a"
Исходный код Редактировать
proc tailDir(path: string): string {...}{.noSideEffect, gcsafe, extern: "nos$1",
                                     raises: [], tags: [].}

Возвращает хвостовую часть path.

См. также:

  • relativePath proc
  • splitPath proc
  • parentDir proc

Пример:

assert tailDir("/bin") == "bin"
assert tailDir("bin") == ""
assert tailDir("bin/") == ""
assert tailDir("/usr/local/bin") == "usr/local/bin"
assert tailDir("//usr//local//bin//") == "usr//local//bin//"
assert tailDir("./usr/local/bin") == "usr/local/bin"
assert tailDir("usr/local/bin") == "local/bin"
Исходный код Редактировать
proc isRootDir(path: string): bool {...}{.noSideEffect, gcsafe, extern: "nos$1",
                                     raises: [], tags: [].}
Проверяет, является ли данный path корневым каталогом.

Пример:

assert isRootDir("")
assert isRootDir(".")
assert isRootDir("/")
assert isRootDir("a")
assert not isRootDir("/a")
assert not isRootDir("a/b/c")
Исходный код Редактировать
proc `/../`(head, tail: string): string {...}{.noSideEffect, raises: [], tags: [].}

То же самое, что и parentDir(head) / tail, если родительский каталог отсутствует. Тогда выполняется head / tail.

См. также:

  • / proc
  • parentDir proc

Пример:

when defined(posix):
  assert "a/b/c" /../ "d/e" == "a/b/d/e"
  assert "a" /../ "d/e" == "a/d/e"
Исходный код Редактировать
proc searchExtPos(path: string): int {...}{.raises: [], tags: [].}

Возвращает индекс символа '.' в path, если он обозначает начало расширения. В противном случае возвращает -1.

См. также:

  • splitFile proc
  • extractFilename proc
  • lastPathPart proc
  • changeFileExt proc
  • addFileExt proc

Пример:

assert searchExtPos("a/b/c") == -1
assert searchExtPos("c.nim") == 1
assert searchExtPos("a/b/c.nim") == 5
assert searchExtPos("a.b.c.nim") == 5
Исходный код Редактировать
proc splitFile(path: string): tuple[dir, name, ext: string] {...}{.noSideEffect,
    gcsafe, extern: "nos$1", raises: [], tags: [].}

Разделяет имя файла на (dir, name, extension) кортеж.

dir не заканчивается на DirSep, за исключением случаев, когда это /. extension включает ведущую точку.

Если у path нет расширения, то ext - это пустая строка. Если у path нет компоненты каталога, то dir - это пустая строка. Если у path нет компоненты имени файла, то name и ext - пустые строки.

См. также:

  • searchExtPos proc
  • extractFilename proc
  • lastPathPart proc
  • changeFileExt proc
  • addFileExt proc

Пример:

var (dir, name, ext) = splitFile("usr/local/nimc.html")
assert dir == "usr/local"
assert name == "nimc"
assert ext == ".html"
(dir, name, ext) = splitFile("/usr/local/os")
assert dir == "/usr/local"
assert name == "os"
assert ext == ""
(dir, name, ext) = splitFile("/usr/local/")
assert dir == "/usr/local"
assert name == ""
assert ext == ""
(dir, name, ext) = splitFile("/tmp.txt")
assert dir == "/"
assert name == "tmp"
assert ext == ".txt"
Исходный код Редактировать
proc extractFilename(path: string): string {...}{.noSideEffect, gcsafe,
    extern: "nos$1", raises: [], tags: [].}

Извлекает имя файла из заданного path.

Это то же самое, что и name & ext из splitFile(path) proc.

См. также:

  • searchExtPos proc
  • splitFile proc
  • lastPathPart proc
  • changeFileExt proc
  • addFileExt proc

Пример:

assert extractFilename("foo/bar/") == ""
assert extractFilename("foo/bar") == "bar"
assert extractFilename("foo/bar.baz") == "bar.baz"
Исходный код Редактировать
proc lastPathPart(path: string): string {...}{.noSideEffect, gcsafe, extern: "nos$1",
    raises: [], tags: [].}

Подобно extractFilename proc, но игнорирует конечный разделитель каталога; также известен как: baseName на некоторых других языках.

См. также:

  • searchExtPos proc
  • splitFile proc
  • extractFilename proc
  • changeFileExt proc
  • addFileExt proc

Пример:

assert lastPathPart("foo/bar/") == "bar"
assert lastPathPart("foo/bar") == "bar"
Исходный код Редактировать
proc changeFileExt(filename, ext: string): string {...}{.noSideEffect, gcsafe,
    extern: "nos$1", raises: [], tags: [].}

Изменяет расширение файла на ext.

Если у filename нет расширения, ext будет добавлено. Если ext == "" то любое расширение удаляется.

Ext должно быть указано без ведущего '.', так как некоторые файловые системы могут использовать другой символ. (Хотя мне не известен ни один такой зверь.)

См. также:

  • searchExtPos proc
  • splitFile proc
  • extractFilename proc
  • lastPathPart proc
  • addFileExt proc

Пример:

assert changeFileExt("foo.bar", "baz") == "foo.baz"
assert changeFileExt("foo.bar", "") == "foo"
assert changeFileExt("foo", "baz") == "foo.baz"
Исходный код Редактировать
proc addFileExt(filename, ext: string): string {...}{.noSideEffect, gcsafe,
    extern: "nos$1", raises: [], tags: [].}

Добавляет расширение файла ext к filename, если у filename ещё нет расширения.

Ext должно быть указано без ведущего '.', так как некоторые файловые системы могут использовать другой символ. (Хотя мне не известен ни один такой зверь.)

См. также:

  • searchExtPos proc
  • splitFile proc
  • extractFilename proc
  • lastPathPart proc
  • changeFileExt proc

Пример:

assert addFileExt("foo.bar", "baz") == "foo.bar"
assert addFileExt("foo.bar", "") == "foo.bar"
assert addFileExt("foo", "baz") == "foo.baz"
Исходный код Редактировать
proc cmpPaths(pathA, pathB: string): int {...}{.noSideEffect, gcsafe,
    extern: "nos$1", raises: [], tags: [].}

Сравнивает два пути.

В случае чувствительной к регистру файловой системы сравнение выполняется чувствительно к регистру, в противном случае — без учёта регистра. Возвращает:

0 если pathA == pathB
< 0 если pathA < pathB
> 0 если pathA > pathB

Пример:

when defined(macosx):
  assert cmpPaths("foo", "Foo") == 0
elif defined(posix):
  assert cmpPaths("foo", "Foo") > 0
Исходный код Редактировать
proc unixToNativePath(path: string; drive = ""): string {...}{.noSideEffect, gcsafe,
    extern: "nos$1", raises: [], tags: [].}

Преобразует путь в стиле UNIX в нативный.

В системе UNIX ничего не делает. В противном случае преобразует '/', '.', '..' в соответствующие значения.

В системах с понятием "дисков" drive используется для определения метки диска, которая используется при преобразовании абсолютного пути. drive по умолчанию соответствует диску текущей рабочей директории и игнорируется в системах, не имеющих концепции "дисков".

Исходный код Редактировать
proc `==`(err1, err2: OSErrorCode): bool {...}{.borrow.}
Исходный код Редактировать
proc `$`(err: OSErrorCode): string {...}{.borrow.}
Исходный код Редактировать
proc osErrorMsg(errorCode: OSErrorCode): string {...}{.raises: [], tags: [].}

Преобразует код ошибки ОС в удобочитаемую строку.

Код ошибки можно получить, используя osLastError proc.

Если преобразование не удалось или errorCode является 0, будет возвращено "".

В Windows флаг компиляции -d:useWinAnsi можно использовать для того, чтобы эта процедура использовала вызовы Win API без Unicode при получении сообщения.

См. также:

  • raiseOSError proc
  • osLastError proc

Пример:

when defined(linux):
  assert osErrorMsg(OSErrorCode(0)) == ""
  assert osErrorMsg(OSErrorCode(1)) == "Operation not permitted"
  assert osErrorMsg(OSErrorCode(2)) == "No such file or directory"
Исходный код Редактировать
proc newOSError(errorCode: OSErrorCode; additionalInfo = ""): owned(ref OSError) {...}{.
    noinline, raises: [], tags: [].}

Создаёт новый исключение OSError.

errorCode будет определять сообщение, osErrorMsg proc будет использоваться для получения этого сообщения.

Код ошибки можно получить, используя osLastError proc.

Если код ошибки 0, или сообщение об ошибке получить не удалось, будет использовано сообщение unknown OS error.

См. также:

  • osErrorMsg proc
  • osLastError proc
Исходный код Редактировать
proc raiseOSError(errorCode: OSErrorCode; additionalInfo = "") {...}{.noinline,
    raises: [OSError], tags: [].}

Вызывает исключение OSError.

Прочитайте описание newOSError proc, чтобы узнать, как создаётся объект исключения.

Исходный код Редактировать
proc osLastError(): OSErrorCode {...}{.sideEffect, raises: [], tags: [].}

Возвращает последний код ошибки операционной системы.

Эта процедура полезна в случае, если вызов ОС завершается неудачно. В этом случае эта процедура вернёт код ошибки, описывающий причину неудачи вызова ОС. Затем процедура OSErrorMsg может быть использована для преобразования этого кода в строку.

Предупреждение: Поведение этой процедуры различается между Windows и системами POSIX. В Windows некоторые вызовы ОС могут сбросить код ошибки на 0, заставив эту процедуру вернуть 0. Поэтому рекомендуется вызывать эту процедуру сразу после неудачного вызова ОС. В системах POSIX это не проблема.

См. также:

  • osErrorMsg proc
  • raiseOSError proc
Исходный код Редактировать
proc getEnv(key: string; default = ""): TaintedString {...}{.tags: [ReadEnvEffect],
    raises: [].}

Возвращает значение переменной среды с именем key.

Если переменная не существует, возвращается "". Чтобы отличить, существует ли переменная или её значение просто "", вызовите existsEnv(key) proc.

См. также:

  • existsEnv proc
  • putEnv proc
  • delEnv proc
  • envPairs iterator

Пример:

assert getEnv("unknownEnv") == ""
assert getEnv("unknownEnv", "doesn't exist") == "doesn't exist"
Исходный код Редактировать
proc existsEnv(key: string): bool {...}{.tags: [ReadEnvEffect], raises: [].}

Проверяет, существует ли переменная среды с именем key. Возвращает true, если существует, false — в противном случае.

См. также:

  • getEnv proc
  • putEnv proc
  • delEnv proc
  • envPairs iterator

Пример:

assert not existsEnv("unknownEnv")
Исходный код Редактировать
proc putEnv(key, val: string) {...}{.tags: [WriteEnvEffect], raises: [OSError].}

Устанавливает значение переменной среды с именем key на val. При возникновении ошибки, выбрасывается OSError.

См. также:

  • getEnv proc
  • existsEnv proc
  • delEnv proc
  • envPairs iterator
Исходный код Редактировать
proc delEnv(key: string) {...}{.tags: [WriteEnvEffect], raises: [OSError].}

Удаляет переменную среды с именем key. При возникновении ошибки, поднимается OSError.

См. также:ven

  • процедура getEnv
  • процедура existsEnv
  • процедура putEnv
  • итератор envPairs
Исходный код Редактировать
proc getHomeDir(): string {...}{.gcsafe, extern: "nos$1",
                            tags: [ReadEnvEffect, ReadIOEffect], raises: [].}

Возвращает домашний каталог текущего пользователя.

Эта процедура обернута процедурой expandTilde для удобства обработки путей, полученных из пользовательских конфигурационных файлов.

См. также:

  • процедура getConfigDir
  • процедура getTempDir
  • процедура expandTilde
  • процедура getCurrentDir
  • процедура setCurrentDir

Пример:

assert getHomeDir() == expandTilde("~")
Исходный код Редактировать
proc getConfigDir(): string {...}{.gcsafe, extern: "nos$1",
                              tags: [ReadEnvEffect, ReadIOEffect], raises: [].}

Возвращает каталог конфигурации текущего пользователя для приложений.

В системах, отличных от Windows, эта процедура соответствует спецификации XDG Base Directory. Таким образом, эта процедура возвращает значение переменной среды XDG_CONFIG_HOME, если она установлена, в противном случае возвращает каталог конфигурации по умолчанию ("~/.config/").

Завершающий слэш, зависящий от ОС, всегда присутствует в конце возвращаемой строки: \ в Windows и / во всех других ОС.

См. также:

  • процедура getHomeDir
  • процедура getTempDir
  • процедура expandTilde
  • процедура getCurrentDir
  • процедура setCurrentDir
Исходный код Редактировать
proc getTempDir(): string {...}{.gcsafe, extern: "nos$1",
                            tags: [ReadEnvEffect, ReadIOEffect], raises: [].}

Возвращает временный каталог текущего пользователя для приложений, чтобы сохранять временные файлы.

Пожалуйста, не используйте это: В Android она в настоящее время возвращает getHomeDir(), а в других системах на основе Unix тоже может вызвать проблемы с безопасностью. Однако вы можете переопределить эту реализацию, добавив -d:tempDir=mytempname в вызов вашего компилятора.

См. также:

  • процедура getHomeDir
  • процедура getConfigDir
  • процедура expandTilde
  • процедура getCurrentDir
  • процедура setCurrentDir
Исходный код Редактировать
proc expandTilde(path: string): string {...}{.tags: [ReadEnvEffect, ReadIOEffect],
    raises: [].}

Расширяет ~ или путь, начинающийся с ~/, до полного пути, заменяя ~ на getHomeDir() (в противном случае возвращает path без изменений).

Windows: это всё ещё поддерживается, несмотря на то, что в Windows нет этой конвенции; также обрабатываются как ~/, так и ~\.

Предупреждение: ~bob и ~bob/ ещё не обрабатываются корректно.

См. также:

  • процедура getHomeDir
  • процедура getConfigDir
  • процедура getTempDir
  • процедура getCurrentDir
  • процедура setCurrentDir

Пример:

assert expandTilde("~" / "appname.cfg") == getHomeDir() / "appname.cfg"
assert expandTilde("~/foo/bar") == getHomeDir() / "foo/bar"
assert expandTilde("/foo/bar") == "/foo/bar"
Исходный код Редактировать
proc quoteShellWindows(s: string): string {...}{.noSideEffect, gcsafe,
    extern: "nosp$1", raises: [], tags: [].}

Приводит s в кавычки, чтобы его можно было безопасно передать в API Windows.

Основано на subprocess.list2cmdline из Python. Подробнее см. ссылку.

Исходный код Редактировать
proc quoteShellPosix(s: string): string {...}{.noSideEffect, gcsafe,
    extern: "nosp$1", raises: [], tags: [].}
Приводит s в кавычки, чтобы его можно было безопасно передать в POSIX оболочку. Основано на pipes.quote из Python. Исходный код Редактировать
proc quoteShell(s: string): string {...}{.noSideEffect, gcsafe, extern: "nosp$1",
                                     raises: [], tags: [].}

Приводит s в кавычки, чтобы его можно было безопасно передать в оболочку.

В Windows она вызывает процедуру quoteShellWindows. В противном случае вызывает процедуру quoteShellPosix.

Исходный код Редактировать
proc quoteShellCommand(args: openArray[string]): string {...}{.raises: [], tags: [].}
Объединяет и приводит в кавычки аргументы оболочки args.

Пример:

when defined(posix):
  assert quoteShellCommand(["aaa", "", "c d"]) == "aaa '' 'c d'"
when defined(windows):
  assert quoteShellCommand(["aaa", "", "c d"]) == "aaa \"\" \"c d\""
Исходный код Редактировать
proc fileExists(filename: string): bool {...}{.gcsafe, extern: "nos$1",
    tags: [ReadDirEffect], raises: [].}

Возвращает true, если filename существует и является обычным файлом или символической ссылкой.

Каталоги, устройства, именованные каналы и сокеты возвращают false.

См. также:

  • процедура dirExists
  • процедура symlinkExists
Исходный код Редактировать
proc dirExists(dir: string): bool {...}{.gcsafe, extern: "nos$1",
                                    tags: [ReadDirEffect], raises: [].}

Возвращает true, если каталог dir существует. Если dir является файлом, возвращается false. Следует за символическими ссылками.

См. также:

  • процедура fileExists
  • процедура symlinkExists
Исходный код Редактировать
proc symlinkExists(link: string): bool {...}{.gcsafe, extern: "nos$1",
    tags: [ReadDirEffect], raises: [].}

Возвращает true, если символическая ссылка link существует. Будет возвращать true независимо от того, указывает ли ссылка на каталог или файл.

См. также:

  • процедура fileExists
  • процедура dirExists
Исходный код Редактировать
proc findExe(exe: string; followSymlinks: bool = true;
             extensions: openArray[string] = ExeExts): string {...}{.
    tags: [ReadDirEffect, ReadEnvEffect, ReadIOEffect], raises: [OSError].}

Ищет exe в текущем рабочем каталоге, а затем в каталогах, указанных в переменной среды PATH.

Возвращает "", если exe не найдено. exe добавляются расширения файлов из ExeExts, если их нет.

Если система поддерживает символические ссылки, она также разрешает их до тех пор, пока не встретит фактический файл. Это поведение можно отключить, если нужно, установив followSymlinks = false.

Исходный код Редактировать
proc getLastModificationTime(file: string): times.Time {...}{.gcsafe,
    extern: "nos$1", raises: [OSError], tags: [].}

Возвращает время последнего изменения file.

См. также:

  • процедура getLastAccessTime
  • процедура getCreationTime
  • процедура fileNewer
Исходный код Редактировать
proc getLastAccessTime(file: string): times.Time {...}{.gcsafe, extern: "nos$1",
    raises: [OSError], tags: [].}

Возвращает время последнего доступа (чтения или записи) file.

См. также:

  • процедура getLastModificationTime
  • процедура getCreationTime
  • процедура fileNewer
Исходный код Редактировать
proc getCreationTime(file: string): times.Time {...}{.gcsafe, extern: "nos$1",
    raises: [OSError], tags: [].}

Возвращает время создания file.

Примечание: В системах POSIX возвращаемое время может фактически быть временем последнего изменения атрибутов файла. Подробнее см. здесь.

См. также:

  • процедура getLastModificationTime
  • процедура getLastAccessTime
  • процедура fileNewer
Исходный код Редактировать
proc fileNewer(a, b: string): bool {...}{.gcsafe, extern: "nos$1", raises: [OSError],
                                     tags: [].}

Возвращает true, если файл a новее, чем файл b, т.е. если время изменения a позже, чем время изменения b.

См. также:

  • процедура getLastModificationTime
  • процедура getLastAccessTime
  • процедура getCreationTime
Исходный код Редактировать
proc getCurrentDir(): string {...}{.gcsafe, extern: "nos$1", tags: [],
                               raises: [OSError].}
END_OF_DOCUMENT_MARKER

Возвращает текущую рабочую директорию, т.е. место, где запускается скомпилированный бинарник.

Путь, возвращаемый этой процедурой, определяется во время выполнения.

См. также:

  • процедура getHomeDir
  • процедура getConfigDir
  • процедура getTempDir
  • процедура setCurrentDir
  • шаблон currentSourcePath
  • процедура getProjectPath
Исходный код Редактировать
proc setCurrentDir(newDir: string) {...}{.inline, tags: [], raises: [OSError].}

Устанавливает текущую рабочую директорию; OSError возникает, если newDir не может быть установлена.

См. также:

  • процедура getHomeDir
  • процедура getConfigDir
  • процедура getTempDir
  • процедура getCurrentDir
Исходный код Редактировать
proc absolutePath(path: string; root = getCurrentDir()): string {...}{.
    raises: [ValueError], tags: [].}

Возвращает абсолютный путь к path, с корнем в root (должен быть абсолютным; по умолчанию: текущая директория). Если path абсолютный, возвращается он, игнорируя root.

См. также:

  • процедура normalizedPath
  • процедура normalizePath

Пример:

assert absolutePath("a") == getCurrentDir() / "a"
Исходный код Редактировать
proc normalizeExe(file: var string) {...}{.raises: [], tags: [].}
на posix, добавляет ./ если file не содержит / и не является "", ".", "..".

Пример:

import sugar
when defined(posix):
  doAssert "foo".dup(normalizeExe) == "./foo"
  doAssert "foo/../bar".dup(normalizeExe) == "foo/../bar"
doAssert "".dup(normalizeExe) == ""
Исходный код Редактировать
proc normalizePath(path: var string) {...}{.gcsafe, extern: "nos$1", tags: [],
                                       raises: [].}

Нормализует путь.

Последовательные разделители каталогов сворачиваются, включая начальный двойной слэш.

Для относительных путей последовательности двойной точки (..) сворачиваются, если это возможно. Для абсолютных путей они всегда сворачиваются.

Предупреждение: URL-кодированные и Юникод-попытки перехода по каталогам не обнаруживаются. Тройная точка не обрабатывается.

См. также:

  • процедура absolutePath
  • процедура normalizedPath для варианта без изменения места
  • процедура normalizeExe

Пример:

when defined(posix):
  var a = "a///b//..//c///d"
  a.normalizePath()
  assert a == "a/c/d"
Исходный код Редактировать
proc normalizedPath(path: string): string {...}{.gcsafe, extern: "nos$1", tags: [],
    raises: [].}

Возвращает нормализованный путь для текущей ОС.

См. также:

  • процедура absolutePath
  • процедура normalizePath для варианта в месте

Пример:

when defined(posix):
  assert normalizedPath("a///b//..//c///d") == "a/c/d"
Исходный код Редактировать
proc sameFile(path1, path2: string): bool {...}{.gcsafe, extern: "nos$1",
    tags: [ReadDirEffect], raises: [OSError].}

Возвращает true, если оба аргумента пути указывают на один и тот же физический файл или каталог.

Возбуждает OSError если любой из файлов не существует или информация о нём недоступна.

Эта процедура вернёт true, если даны два альтернативных жёстких ссылки или символические ссылки на один и тот же файл или каталог.

См. также:

  • процедура sameFileContent
Исходный код Редактировать
proc sameFileContent(path1, path2: string): bool {...}{.gcsafe, extern: "nos$1",
    tags: [ReadIOEffect], raises: [IOError].}

Возвращает true, если оба аргумента пути указывают на файлы с идентичным двоичным содержимым.

См. также:

  • процедура sameFile
Исходный код Редактировать
proc getFilePermissions(filename: string): set[FilePermission] {...}{.gcsafe,
    extern: "nos$1", tags: [ReadDirEffect], raises: [OSError].}

Получает права доступа к filename.

OSError возбуждается в случае ошибки. В Windows проверяется только флаг readonly, все остальные разрешения доступны в любом случае.

См. также:

  • процедура setFilePermissions
  • перечисление FilePermission
Исходный код Редактировать
proc setFilePermissions(filename: string; permissions: set[FilePermission]) {...}{.
    gcsafe, extern: "nos$1", tags: [WriteDirEffect], raises: [OSError].}

Устанавливает права доступа к filename.

OSError возбуждается в случае ошибки. В Windows изменяется только флаг readonly, в зависимости от разрешений fpUserWrite.

См. также:

  • процедура getFilePermissions
  • перечисление FilePermission
Исходный код Редактировать
proc copyFile(source, dest: string) {...}{.gcsafe, extern: "nos$1",
                                      tags: [ReadIOEffect, WriteIOEffect],
                                      raises: [OSError, IOError].}

Копирует файл из source в dest, где dest.parentDir должен существовать.

Если это не удалось, возникает OSError.

На платформе Windows эта процедура скопирует атрибуты исходного файла в dest.

На других платформах необходимо использовать процедуры getFilePermissions и setFilePermissions, чтобы скопировать их вручную (или использовать удобную процедуру copyFileWithPermissions), иначе dest унаследует стандартные разрешения вновь созданного файла для пользователя.

Если dest уже существует, атрибуты файла будут сохранены, а содержимое перезаписано.

См. также:

  • процедура copyDir
  • процедура copyFileWithPermissions
  • процедура tryRemoveFile
  • процедура removeFile
  • процедура moveFile
Исходный код Редактировать
proc copyFileToDir(source, dir: string) {...}{.
    raises: [ValueError, OSError, IOError], tags: [ReadIOEffect, WriteIOEffect].}
Копирует файл source в каталог dir, который должен существовать. Исходный код Редактировать
proc tryRemoveFile(file: string): bool {...}{.gcsafe, extern: "nos$1",
    tags: [WriteDirEffect], raises: [].}

Удаляет file.

Если это не удалось, возвращается false. Это не приводит к ошибке, если файл изначально не существовал.

В Windows игнорируется атрибут только для чтения.

См. также:

  • процедура copyFile
  • процедура copyFileWithPermissions
  • процедура removeFile
  • процедура moveFile
Исходный код Редактировать
proc removeFile(file: string) {...}{.gcsafe, extern: "nos$1", tags: [WriteDirEffect],
                                raises: [OSError].}

Удаляет file.

Если это не удалось, возбуждается OSError. Это не приводит к ошибке, если файл изначально не существовал.

В Windows игнорируется атрибут только для чтения.

См. также:

  • процедура removeDir
  • процедура copyFile
  • процедура copyFileWithPermissions
  • процедура tryRemoveFile
  • процедура moveFile
Исходный код Редактировать
proc moveFile(source, dest: string) {...}{.gcsafe, extern: "nos$1",
                                      tags: [ReadIOEffect, WriteIOEffect],
                                      raises: [OSError, IOError, Exception].}

Перемещает файл из source в dest.

Если это не удалось, возбуждается OSError. Если dest уже существует, он будет перезаписан.

Может использоваться для переименования файлов.

См. также:

  • процедура moveDir
  • процедура copyFile
  • процедура copyFileWithPermissions
  • процедура removeFile
  • процедура tryRemoveFile
Исходный код Редактировать
proc exitStatusLikeShell(status: cint): cint {...}{.raises: [], tags: [].}
Преобразует код выхода из c_system в код выхода оболочки. Исходный код Редактировать
proc execShellCmd(command: string): int {...}{.gcsafe, extern: "nos$1",
    tags: [ExecIOEffect], raises: [].}

Выполняет команду оболочки.

Команда имеет вид 'программа аргументы', где аргументы — аргументы командной строки, передаваемые программе. Процедура возвращает код ошибки оболочки по завершении (ноль, если ошибки нет). Процедура не возвращается, пока процесс не завершится.

Чтобы выполнить программу без участия оболочки, используйте процедуру osproc.execProcess.

Примеры:

discard execShellCmd("ls -la")
Исходный код Редактировать
proc expandFilename(filename: string): string {...}{.gcsafe, extern: "nos$1",
    tags: [ReadDirEffect], raises: [OSError].}

Возвращает полный (абсолютный) путь к существующему файлу filename.

В случае ошибки генерирует OSError. Следует за символическими ссылками.

Исходный код Редактировать
proc getCurrentCompilerExe(): string {...}{.compileTime, raises: [], tags: [].}

Это getAppFilename() во время компиляции.

Может использоваться для получения текущей исполняемой программы компилятора Nim из программы Nim или nimscript, или двоичного файла nimble внутри программы nimble (аналогично с другими двоичными файлами, построенными из API компилятора).

Исходный код Редактировать
proc removeDir(dir: string; checkDir = false) {...}{.gcsafe, extern: "nos$1",
    tags: [WriteDirEffect, ReadDirEffect], gcsafe, locks: 0, raises: [OSError].}

Удаляет директорию dir, включая все поддиректории и файлы в dir (рекурсивно).

Если это не удаётся, генерируется OSError. Это не приводит к ошибке, если директория никогда не существовала, если только checkDir = true

См. также:

  • tryRemoveFile proc
  • removeFile proc
  • existsOrCreateDir proc
  • createDir proc
  • copyDir proc
  • copyDirWithPermissions proc
  • moveDir proc
Исходный код Редактировать
proc existsOrCreateDir(dir: string): bool {...}{.gcsafe, extern: "nos$1",
    tags: [WriteDirEffect, ReadDirEffect], raises: [OSError, IOError].}

Проверяет существование директории dir и создаёт её, если она не существует.

Не создаёт родительские директории (ошибка, если родительская директория не существует). Возвращает true если директория уже существует, и false в противном случае.

См. также:

  • removeDir proc
  • createDir proc
  • copyDir proc
  • copyDirWithPermissions proc
  • moveDir proc
Исходный код Редактировать
proc createDir(dir: string) {...}{.gcsafe, extern: "nos$1",
                              tags: [WriteDirEffect, ReadDirEffect],
                              raises: [OSError, IOError].}

Создаёт директорию dir.

Директория может содержать несколько поддиректорий, которые ещё не существуют. Полный путь создаётся. Если это не удаётся, генерируется OSError.

Она не генерирует ошибку, если директория уже существует, так как для большинства случаев это не является ошибкой.

См. также:

  • removeDir proc
  • existsOrCreateDir proc
  • copyDir proc
  • copyDirWithPermissions proc
  • moveDir proc
Исходный код Редактировать
proc copyDir(source, dest: string) {...}{.gcsafe, extern: "nos$1",
                                     tags: [WriteIOEffect, ReadIOEffect],
                                     gcsafe, locks: 0,
                                     raises: [OSError, IOError].}

Копирует директорию из source в dest.

Если это не удаётся, генерируется OSError.

На платформе Windows эта процедура скопирует атрибуты из source в dest.

На других платформах созданные файлы и директории унаследуют стандартные права нового файла/директории для пользователя. Используйте copyDirWithPermissions proc, чтобы сохранить атрибуты рекурсивно на этих платформах.

См. также:

  • copyDirWithPermissions proc
  • copyFile proc
  • copyFileWithPermissions proc
  • removeDir proc
  • existsOrCreateDir proc
  • createDir proc
  • moveDir proc
Исходный код Редактировать
proc moveDir(source, dest: string) {...}{.tags: [ReadIOEffect, WriteIOEffect],
                                     raises: [OSError, IOError].}

Перемещает директорию из source в dest.

Если это не удаётся, генерируется OSError.

См. также:

  • moveFile proc
  • copyDir proc
  • copyDirWithPermissions proc
  • removeDir proc
  • existsOrCreateDir proc
  • createDir proc
Исходный код Редактировать
proc createSymlink(src, dest: string) {...}{.raises: [OSError], tags: [].}

Создаёт символическую ссылку в dest, которая указывает на элемент, указанный в src. На большинстве операционных систем, выдаст ошибку, если ссылка уже существует.

Предупреждение: Некоторые ОС (такие как Microsoft Windows) ограничивают создание символических ссылок для пользователей с правами администратора.

См. также:

  • createHardlink proc
  • expandSymlink proc
Исходный код Редактировать
proc createHardlink(src, dest: string) {...}{.raises: [OSError], tags: [].}

Создаёт жёсткую ссылку в dest, которая указывает на элемент, указанный в src.

Предупреждение: Некоторые ОС ограничивают создание жёстких ссылок для пользователей с правами администратора.

См. также:

  • createSymlink proc
Исходный код Редактировать
proc copyFileWithPermissions(source, dest: string; ignorePermissionErrors = true) {...}{.
    raises: [OSError, IOError, Exception],
    tags: [ReadIOEffect, WriteIOEffect, WriteDirEffect, ReadDirEffect].}

Копирует файл из source в dest сохраняя права доступа.

Это процедура-обёртка вокруг copyFile, getFilePermissions и setFilePermissions процедур на платформах, отличных от Windows.

В Windows эта процедура просто обёртка для copyFile proc, так как эта процедура уже копирует атрибуты.

На платформах, отличных от Windows, права копируются после того, как сам файл был скопирован, что не происходит атомарно и может привести к гонке. Если ignorePermissionErrors равно true (по умолчанию), ошибки при чтении/установке атрибутов файла будут проигнорированы, иначе генерируется OSError.

См. также:

  • copyFile proc
  • copyDir proc
  • tryRemoveFile proc
  • removeFile proc
  • moveFile proc
  • copyDirWithPermissions proc
Исходный код Редактировать
proc copyDirWithPermissions(source, dest: string; ignorePermissionErrors = true) {...}{.
    gcsafe, extern: "nos$1", tags: [WriteIOEffect, ReadIOEffect], gcsafe,
    locks: 0, raises: [OSError, IOError, Exception].}

Копирует директорию из source в dest сохраняя права доступа.

Если это не удаётся, генерируется OSError. Это процедура-обёртка вокруг copyDir и copyFileWithPermissions процедур на платформах, отличных от Windows.

В Windows эта процедура просто обёртка для copyDir proc, так как эта процедура уже копирует атрибуты.

На платформах, отличных от Windows, права копируются после того, как сам файл или директория были скопированы, что не происходит атомарно и может привести к гонке. Если ignorePermissionErrors равно true (по умолчанию), ошибки при чтении/установке атрибутов файла будут проигнорированы, иначе генерируется OSError.

См. также:

  • copyDir proc
  • copyFile proc
  • copyFileWithPermissions proc
  • removeDir proc
  • moveDir proc
  • existsOrCreateDir proc
  • createDir proc
Исходный код Редактировать
proc inclFilePermissions(filename: string; permissions: set[FilePermission]) {...}{.
    gcsafe, extern: "nos$1", tags: [ReadDirEffect, WriteDirEffect],
    raises: [OSError].}
Удобная процедура для:
setFilePermissions(filename, getFilePermissions(filename)+permissions)
Исходный код Редактировать
proc exclFilePermissions(filename: string; permissions: set[FilePermission]) {...}{.
    gcsafe, extern: "nos$1", tags: [ReadDirEffect, WriteDirEffect],
    raises: [OSError].}
Удобный proc для:
setFilePermissions(filename, getFilePermissions(filename)-permissions)
Исходный код Редактировать
proc expandSymlink(symlinkPath: string): string {...}{.raises: [OSError], tags: [].}

Возвращает строку, представляющую путь, к которому указывает символическая ссылка.

В Windows это бесполезная операция, symlinkPath просто возвращается.

См. также:

  • процедура createSymlink
Исходный код Редактировать
proc parseCmdLine(c: string): seq[string] {...}{.noSideEffect, gcsafe,
    extern: "nos$1", raises: [], tags: [].}

Разделяет строку командной строки на несколько компонентов.

Примечание: Эта процедура используется только иногда, лучше использовать модуль parseopt.

В Windows она использует следующие правила разбора:

  • Аргументы разделяются пробелами, которые могут быть пробелами или табуляцией.
  • Символ каретки (^) не распознаётся как символ экранирования или разделитель. Этот символ обрабатывается полностью анализатором командной строки в операционной системе перед передачей массиву argv в программе.
  • Строка, заключённая в двойные кавычки ("строка"), интерпретируется как один аргумент, независимо от пробелов внутри. Цитированная строка может быть вложена в аргумент.
  • Двойная кавычка, предваряемая обратным слэшем (\"), интерпретируется как символ двойной кавычки (").
  • Обратные слэши интерпретируются буквально, если не предшествуют двойной кавычке.
  • Если за чётным числом обратных слэшей следует двойная кавычка, один обратный слэш помещается в массив argv за каждую пару обратных слэшей, и двойная кавычка интерпретируется как разделитель строк.
  • Если за нечётным числом обратных слэшей следует двойная кавычка, один обратный слэш помещается в массив argv за каждую пару обратных слэшей, и двойная кавычка "экранируется" оставшимся обратным слэшем, помещая в argv символ двойной кавычки (").

В системах Posix она использует следующие правила разбора: компоненты разделяются пробелами, если пробел не находится внутри " или ' кавычек.

См. также:

  • модуль parseopt
  • процедура paramCount
  • процедура paramStr
  • процедура commandLineParams
Исходный код Редактировать
proc paramCount(): int {...}{.tags: [ReadIOEffect], raises: [].}

Возвращает количество аргументов командной строки, переданных приложению.

В отличие от argc в C, если ваш двоичный файл был вызван без параметров, это вернёт ноль. Вы можете запросить каждый отдельный параметр с помощью процедуры paramStr или получить все сразу с помощью процедуры commandLineParams.

Доступность: При генерации динамической библиотеки (см. --app:lib) в Posix эта процедура не определена. Проверьте доступность с помощью declared().

См. также:

  • модуль parseopt
  • процедура parseCmdLine
  • процедура paramStr
  • процедура commandLineParams

Примеры:

when declared(paramCount):
  # Use paramCount() here
else:
  # Do something else!
Исходный код Редактировать
proc paramStr(i: int): TaintedString {...}{.tags: [ReadIOEffect], raises: [].}

Возвращает i-й аргумент командной строки, переданный приложению.

i должен быть в диапазоне 1..paramCount(), исключение IndexDefect будет поднято для недопустимых значений. Вместо итерации по paramCount() с этой процедурой вы можете вызвать удобную commandLineParams().

Аналогично argv в C, возможно вызвать paramStr(0), но это вернёт ОС-специфическое содержимое (обычно имя вызываемого исполняемого файла). Следует избегать этого и вызывать getAppFilename() вместо этого.

Доступность: При генерации динамической библиотеки (см. --app:lib) в Posix эта процедура не определена. Проверьте доступность с помощью declared().

См. также:

  • модуль parseopt
  • процедура parseCmdLine
  • процедура paramCount
  • процедура commandLineParams
  • процедура getAppFilename

Примеры:

when declared(paramStr):
  # Use paramStr() here
else:
  # Do something else!
Исходный код Редактировать
proc commandLineParams(): seq[TaintedString] {...}{.raises: [], tags: [ReadIOEffect].}

Удобная процедура, которая возвращает параметры командной строки.

Возвращает только параметры. Если вам нужно получить имя исполняемого файла приложения, вызовите getAppFilename().

Доступность: В Posix нет портативного способа получить командную строку из DLL, и поэтому процедура не определена в этой среде. Вы можете проверить её доступность с помощью declared().

См. также:

  • модуль parseopt
  • процедура parseCmdLine
  • процедура paramCount
  • процедура paramStr
  • процедура getAppFilename

Примеры:

when declared(commandLineParams):
  # Use commandLineParams() here
else:
  # Do something else!
Исходный код Редактировать
proc getAppFilename(): string {...}{.gcsafe, extern: "nos$1", tags: [ReadIOEffect],
                                raises: [].}

Возвращает имя файла исполняемого файла приложения. Эта процедура разрешает символические ссылки.

См. также:

  • процедура getAppDir
  • процедура getCurrentCompilerExe
Исходный код Редактировать
proc getAppDir(): string {...}{.gcsafe, extern: "nos$1", tags: [ReadIOEffect],
                           raises: [].}

Возвращает каталог исполняемого файла приложения.

См. также:

  • процедура getAppFilename
Исходный код Редактировать
proc sleep(milsecs: int) {...}{.gcsafe, extern: "nos$1", tags: [TimeEffect],
                           raises: [].}
Засыпает milsecs миллисекунд. Исходный код Редактировать
proc getFileSize(file: string): BiggestInt {...}{.gcsafe, extern: "nos$1",
    tags: [ReadIOEffect], raises: [IOError, OSError].}
Возвращает размер файла file (в байтах). OSError генерируется в случае ошибки. Исходный код Редактировать
proc getFileInfo(handle: FileHandle): FileInfo {...}{.raises: [OSError], tags: [].}

Получает информацию о файле для объекта файла, представленного заданным дескриптором.

Если информация не может быть получена, например, когда дескриптор файла недействителен, OSError генерируется.

См. также:

  • процедура getFileInfo(file)
  • процедура getFileInfo(path)
Исходный код Редактировать
proc getFileInfo(file: File): FileInfo {...}{.raises: [IOError, OSError], tags: [].}

Получает информацию о файле для объекта файла.

См. также:

  • процедура getFileInfo(handle)
  • процедура getFileInfo(path)
Исходный код Редактировать
proc getFileInfo(path: string; followSymlink = true): FileInfo {...}{.
    raises: [OSError], tags: [].}

Получает информацию о файле для объекта файла, указанного по path.

Из-за отличий между операционными системами, информация в возвращаемом объекте FileInfo будет немного отличаться в разных платформах, а в некоторых случаях - неполной или неточной.

Когда followSymlink равно true (по умолчанию), символические ссылки отслеживаются, и возвращается информация, относящаяся к целевому объекту символической ссылки. В противном случае, возвращается информация о самой символической ссылке.

Если информация не может быть получена, например, когда путь не существует или когда ограничения доступа препятствуют получению информации о файле, OSError будет сгенерировано.

См. также:

  • процедура getFileInfo(handle)
  • процедура getFileInfo(file)
Исходный код Редактировать
proc isHidden(path: string): bool {...}{.raises: [], tags: [].}

Определяет, является ли path скрытым или нет, используя это справочное руководство.

В Windows: возвращает true, если файл существует и его атрибут "скрытый" установлен.

В Posix: возвращает true, если lastPathPart(path) начинается с . и не является . или ...

Примечание: пути не нормализуются для определения isHidden.

Пример:

when defined(posix):
  assert ".foo".isHidden
  assert not ".foo/bar".isHidden
  assert not ".".isHidden
  assert not "..".isHidden
  assert not "".isHidden
  assert ".foo/".isHidden
Исходный код Редактировать
proc getCurrentProcessId(): int {...}{.raises: [], tags: [].}

Возвращает текущий идентификатор процесса.

См. также:

  • osproc.processID(p: Process)
Исходный код Редактировать
proc setLastModificationTime(file: string; t: times.Time) {...}{.raises: [OSError],
    tags: [].}
Устанавливает время последней модификации file. OSError генерируется в случае ошибки. Исходный код Редактировать

Функции

func isValidFilename(filename: string; maxLen = 259.Positive): bool {...}{.
    raises: [], tags: [].}

Возвращает true, если filename подходит для кроссплатформенного использования.

Это полезно, если вы хотите копировать или сохранять файлы через Windows, Linux, Mac и т. д. Вы также можете передавать полные пути в качестве аргумента, но функция проверяет только имена файлов. Она использует invalidFilenameChars, invalidFilenames и maxLen для проверки указанного filename.

assert not isValidFilename(" foo")    ## Leading white space
assert not isValidFilename("foo ")    ## Trailing white space
assert not isValidFilename("foo.")    ## Ends with Dot
assert not isValidFilename("con.txt") ## "CON" is invalid (Windows)
assert not isValidFilename("OwO:UwU") ## ":" is invalid (Mac)
assert not isValidFilename("aux.bat") ## "AUX" is invalid (Windows)
Исходный код Редактировать

Итераторы

iterator parentDirs(path: string; fromRoot = false; inclusive = true): string {...}{.
    raises: [], tags: [].}

Перебирает все родительские директории заданного path.

Если fromRoot равно true (по умолчанию: false), обход начнется с корневого каталога файловой системы. Если inclusive равно true (по умолчанию), исходный аргумент будет включён в обход.

Относительные пути этим итератором не будут расширены. Вместо этого он будет перебирать только каталоги, присутствующие в относительном пути.

См. также:

  • процедура parentDir

Примеры:

let g = "a/b/c"

for p in g.parentDirs:
  echo p
# a/b/c
# a/b
# a

for p in g.parentDirs(fromRoot=true):
  echo p
# a/
# a/b/
# a/b/c

for p in g.parentDirs(inclusive=false):
  echo p
# a/b
# a
Исходный код Редактировать
iterator envPairs(): tuple[key, value: TaintedString] {...}{.tags: [ReadEnvEffect],
    raises: [].}

Перебирает все переменные среды.

В первой компоненте кортежа хранится имя текущей переменной, во второй — её значение.

См. также:

  • процедура getEnv
  • процедура existsEnv
  • процедура putEnv
  • процедура delEnv
Исходный код Редактировать
iterator walkPattern(pattern: string): string {...}{.tags: [ReadDirEffect],
    raises: [].}

Перебирает все файлы и каталоги, соответствующие pattern.

В POSIX используется вызов glob. pattern зависит от ОС, но по крайней мере поддерживается запись "*.ext".

См. также:

  • итератор walkFiles
  • итератор walkDirs
  • итератор walkDir
  • итератор walkDirRec
Исходный код Редактировать
iterator walkFiles(pattern: string): string {...}{.tags: [ReadDirEffect], raises: [].}

Перебирает все файлы, соответствующие pattern.

В POSIX используется вызов glob. pattern зависит от ОС, но по крайней мере поддерживается запись "*.ext".

См. также:

  • итератор walkPattern
  • итератор walkDirs
  • итератор walkDir
  • итератор walkDirRec
Исходный код Редактировать
iterator walkDirs(pattern: string): string {...}{.tags: [ReadDirEffect], raises: [].}

Перебирает все каталоги, соответствующие pattern.

В POSIX используется вызов glob. pattern зависит от ОС, но по крайней мере поддерживается запись "*.ext".

См. также:

  • итератор walkPattern
  • итератор walkFiles
  • итератор walkDir
  • итератор walkDirRec
Исходный код Редактировать
iterator walkDir(dir: string; relative = false; checkDir = false): tuple[
    kind: PathComponent, path: string] {...}{.tags: [ReadDirEffect],
    raises: [OSError].}

Перебирает директорию dir и возвращает для каждого каталога или файла в dir. Возвращаются тип компонента и полный путь для каждого элемента.

Обход не рекурсивный. Если relative равно true (по умолчанию: false), результирующий путь сокращается до относительного пути по отношению к dir. Пример: данная структура каталогов:

dirA / dirB / fileB1.txt
     / dirC
     / fileA1.txt
     / fileA2.txt

и этот код:

for kind, path in walkDir("dirA"):
  echo(path)

выводят (но не обязательно в таком порядке!):

dirA/dirB
dirA/dirC
dirA/fileA1.txt
dirA/fileA2.txt

См. также:

  • итератор walkPattern
  • итератор walkFiles
  • итератор walkDirs
  • итератор walkDirRec
Исходный код Редактировать
iterator walkDirRec(dir: string; yieldFilter = {pcFile}; followFilter = {pcDir};
                    relative = false; checkDir = false): string {...}{.
    tags: [ReadDirEffect], raises: [OSError].}

Рекурсивно перебирает директорию dir и возвращает для каждого файла или каталога в dir.

Если relative равно true (по умолчанию: false), результирующий путь сокращается до относительного пути по отношению к dir, в противном случае возвращается полный путь.

Предупреждение: изменение структуры каталогов во время обхода может привести к неопределённому поведению!

Обход рекурсивный. followFilter управляет поведением итератора:

yieldFilter значение
pcFile возвращать реальные файлы (по умолчанию)
pcLinkToFile возвращать символические ссылки на файлы
pcDir возвращать реальные каталоги
pcLinkToDir возвращать символические ссылки на каталоги
followFilter значение
pcDir следовать за реальными каталогами (по умолчанию)
pcLinkToDir следовать за символическими ссылками на каталоги

См. также:

  • итератор walkPattern
  • итератор walkFiles
  • итератор walkDirs
  • итератор walkDir
Исходный код Редактировать

Шаблоны

template existsFile(args: varargs[untyped]): untyped {...}{.
    deprecated: "use fileExists".}
Устарело: используйте fileExists
Исходный код Редактировать
template existsDir(args: varargs[untyped]): untyped {...}{.
    deprecated: "use dirExists".}
Устарело: используйте dirExists
Исходный код Редактировать

© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/os.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API