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.
См. также:
Исходный код Редактировать 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
-
Перечисление, определяющее компонент пути.
См. также:
Исходный код Редактировать 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!
-
Содержит информацию, связанную с объектом файла.
См. также:
Исходный код Редактировать
Константы
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 один).См. также:
Пример:
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, но работает с любым количеством частей каталога.
Вам нужно передать как минимум один элемент, иначе процедура будет утверждать при отладке и аварийно завершаться при релизной сборке.
См. также:
Пример:
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").См. также:
Пример:
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как есть, так как невозможно создать относительный путь. Это означает, что может быть возвращён абсолютный путь.См. также:
Пример:
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.См. также:
Пример:
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.См. также:
Пример:
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.См. также:
Пример:
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.См. также:
Пример:
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- пустые строки.См. также:
Пример:
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.См. также:
Пример:
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 на некоторых других языках.
См. также:
Пример:
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должно быть указано без ведущего'.', так как некоторые файловые системы могут использовать другой символ. (Хотя мне не известен ни один такой зверь.)См. также:
Пример:
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должно быть указано без ведущего'.', так как некоторые файловые системы могут использовать другой символ. (Хотя мне не известен ни один такой зверь.)См. также:
Пример:
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 при получении сообщения.См. также:
Пример:
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.См. также:
Исходный код Редактировать 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 это не проблема.См. также:
Исходный код Редактировать proc getEnv(key: string; default = ""): TaintedString {...}{.tags: [ReadEnvEffect], raises: [].}-
Возвращает значение переменной среды с именем
key.Если переменная не существует, возвращается
"". Чтобы отличить, существует ли переменная или её значение просто"", вызовите existsEnv(key) proc.См. также:
Пример:
assert getEnv("unknownEnv") == "" assert getEnv("unknownEnv", "doesn't exist") == "doesn't exist"Исходный код Редактировать proc existsEnv(key: string): bool {...}{.tags: [ReadEnvEffect], raises: [].}-
Проверяет, существует ли переменная среды с именем
key. Возвращает true, если существует, false — в противном случае.См. также:
Пример:
assert not existsEnv("unknownEnv")Исходный код Редактировать proc putEnv(key, val: string) {...}{.tags: [WriteEnvEffect], raises: [OSError].}-
Устанавливает значение переменной среды с именем
keyнаval. При возникновении ошибки, выбрасываетсяOSError.См. также:
Исходный код Редактировать proc delEnv(key: string) {...}{.tags: [WriteEnvEffect], raises: [OSError].}
-
Удаляет переменную среды с именем
key. При возникновении ошибки, поднимаетсяOSError.См. также:ven
Исходный код Редактировать 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 и/во всех других ОС.См. также:
Исходный код Редактировать proc getTempDir(): string {...}{.gcsafe, extern: "nos$1", tags: [ReadEnvEffect, ReadIOEffect], raises: [].}-
Возвращает временный каталог текущего пользователя для приложений, чтобы сохранять временные файлы.
Пожалуйста, не используйте это: В Android она в настоящее время возвращает
getHomeDir(), а в других системах на основе Unix тоже может вызвать проблемы с безопасностью. Однако вы можете переопределить эту реализацию, добавив-d:tempDir=mytempnameв вызов вашего компилятора.См. также:
Исходный код Редактировать 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.
См. также:
Исходный код Редактировать proc dirExists(dir: string): bool {...}{.gcsafe, extern: "nos$1", tags: [ReadDirEffect], raises: [].}-
Возвращает true, если каталог
dirсуществует. Еслиdirявляется файлом, возвращается false. Следует за символическими ссылками.См. также:
Исходный код Редактировать proc symlinkExists(link: string): bool {...}{.gcsafe, extern: "nos$1", tags: [ReadDirEffect], raises: [].}-
Возвращает true, если символическая ссылка
linkсуществует. Будет возвращать true независимо от того, указывает ли ссылка на каталог или файл.См. также:
Исходный код Редактировать 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.См. также:
Исходный код Редактировать proc getLastAccessTime(file: string): times.Time {...}{.gcsafe, extern: "nos$1", raises: [OSError], tags: [].}-
Возвращает время последнего доступа (чтения или записи)
file.См. также:
Исходный код Редактировать proc getCreationTime(file: string): times.Time {...}{.gcsafe, extern: "nos$1", raises: [OSError], tags: [].}-
Возвращает время создания
file.Примечание: В системах POSIX возвращаемое время может фактически быть временем последнего изменения атрибутов файла. Подробнее см. здесь.
См. также:
Исходный код Редактировать proc fileNewer(a, b: string): bool {...}{.gcsafe, extern: "nos$1", raises: [OSError], tags: [].}-
Возвращает true, если файл
aновее, чем файлb, т.е. если время измененияaпозже, чем время измененияb.См. также:
Исходный код Редактировать proc getCurrentDir(): string {...}{.gcsafe, extern: "nos$1", tags: [], raises: [OSError].}
-
Возвращает текущую рабочую директорию, т.е. место, где запускается скомпилированный бинарник.
Путь, возвращаемый этой процедурой, определяется во время выполнения.
См. также:
Исходный код Редактировать proc setCurrentDir(newDir: string) {...}{.inline, tags: [], raises: [OSError].}-
Устанавливает текущую рабочую директорию;
OSErrorвозникает, еслиnewDirне может быть установлена.См. также:
Исходный код Редактировать proc absolutePath(path: string; root = getCurrentDir()): string {...}{. raises: [ValueError], tags: [].}-
Возвращает абсолютный путь к
path, с корнем вroot(должен быть абсолютным; по умолчанию: текущая директория). Еслиpathабсолютный, возвращается он, игнорируяroot.См. также:
Пример:
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, если даны два альтернативных жёстких ссылки или символические ссылки на один и тот же файл или каталог.
См. также:
Исходный код Редактировать proc sameFileContent(path1, path2: string): bool {...}{.gcsafe, extern: "nos$1", tags: [ReadIOEffect], raises: [IOError].}-
Возвращает true, если оба аргумента пути указывают на файлы с идентичным двоичным содержимым.
См. также:
Исходный код Редактировать proc getFilePermissions(filename: string): set[FilePermission] {...}{.gcsafe, extern: "nos$1", tags: [ReadDirEffect], raises: [OSError].}-
Получает права доступа к
filename.OSErrorвозбуждается в случае ошибки. В Windows проверяется только флагreadonly, все остальные разрешения доступны в любом случае.См. также:
Исходный код Редактировать proc setFilePermissions(filename: string; permissions: set[FilePermission]) {...}{. gcsafe, extern: "nos$1", tags: [WriteDirEffect], raises: [OSError].}-
Устанавливает права доступа к
filename.OSErrorвозбуждается в случае ошибки. В Windows изменяется только флагreadonly, в зависимости от разрешенийfpUserWrite.См. также:
Исходный код Редактировать 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уже существует, атрибуты файла будут сохранены, а содержимое перезаписано.См. также:
Исходный код Редактировать 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 игнорируется атрибут только для чтения.
См. также:
Исходный код Редактировать proc removeFile(file: string) {...}{.gcsafe, extern: "nos$1", tags: [WriteDirEffect], raises: [OSError].}-
Удаляет
file.Если это не удалось, возбуждается
OSError. Это не приводит к ошибке, если файл изначально не существовал.В Windows игнорируется атрибут только для чтения.
См. также:
Исходный код Редактировать proc moveFile(source, dest: string) {...}{.gcsafe, extern: "nos$1", tags: [ReadIOEffect, WriteIOEffect], raises: [OSError, IOError, Exception].}-
Перемещает файл из
sourceвdest.Если это не удалось, возбуждается
OSError. Еслиdestуже существует, он будет перезаписан.Может использоваться для переименования файлов.
См. также:
Исходный код Редактировать 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См. также:
Исходный код Редактировать proc existsOrCreateDir(dir: string): bool {...}{.gcsafe, extern: "nos$1", tags: [WriteDirEffect, ReadDirEffect], raises: [OSError, IOError].}-
Проверяет существование директории
dirи создаёт её, если она не существует.Не создаёт родительские директории (ошибка, если родительская директория не существует). Возвращает
trueесли директория уже существует, иfalseв противном случае.См. также:
Исходный код Редактировать proc createDir(dir: string) {...}{.gcsafe, extern: "nos$1", tags: [WriteDirEffect, ReadDirEffect], raises: [OSError, IOError].}-
Создаёт директорию
dir.Директория может содержать несколько поддиректорий, которые ещё не существуют. Полный путь создаётся. Если это не удаётся, генерируется
OSError.Она не генерирует ошибку, если директория уже существует, так как для большинства случаев это не является ошибкой.
См. также:
Исходный код Редактировать 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, чтобы сохранить атрибуты рекурсивно на этих платформах.
См. также:
Исходный код Редактировать proc moveDir(source, dest: string) {...}{.tags: [ReadIOEffect, WriteIOEffect], raises: [OSError, IOError].}-
Перемещает директорию из
sourceвdest.Если это не удаётся, генерируется
OSError.См. также:
Исходный код Редактировать proc createSymlink(src, dest: string) {...}{.raises: [OSError], tags: [].}-
Создаёт символическую ссылку в
dest, которая указывает на элемент, указанный вsrc. На большинстве операционных систем, выдаст ошибку, если ссылка уже существует.Предупреждение: Некоторые ОС (такие как Microsoft Windows) ограничивают создание символических ссылок для пользователей с правами администратора.
См. также:
Исходный код Редактировать proc createHardlink(src, dest: string) {...}{.raises: [OSError], tags: [].}-
Создаёт жёсткую ссылку в
dest, которая указывает на элемент, указанный вsrc.Предупреждение: Некоторые ОС ограничивают создание жёстких ссылок для пользователей с правами администратора.
См. также:
Исходный код Редактировать 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.См. также:
Исходный код Редактировать 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.См. также:
Исходный код Редактировать 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просто возвращается.См. также:
Исходный код Редактировать proc parseCmdLine(c: string): seq[string] {...}{.noSideEffect, gcsafe, extern: "nos$1", raises: [], tags: [].}-
Разделяет строку командной строки на несколько компонентов.
Примечание: Эта процедура используется только иногда, лучше использовать модуль parseopt.
В Windows она использует следующие правила разбора:
- Аргументы разделяются пробелами, которые могут быть пробелами или табуляцией.
- Символ каретки (^) не распознаётся как символ экранирования или разделитель. Этот символ обрабатывается полностью анализатором командной строки в операционной системе перед передачей массиву argv в программе.
- Строка, заключённая в двойные кавычки ("строка"), интерпретируется как один аргумент, независимо от пробелов внутри. Цитированная строка может быть вложена в аргумент.
- Двойная кавычка, предваряемая обратным слэшем (\"), интерпретируется как символ двойной кавычки (").
- Обратные слэши интерпретируются буквально, если не предшествуют двойной кавычке.
- Если за чётным числом обратных слэшей следует двойная кавычка, один обратный слэш помещается в массив argv за каждую пару обратных слэшей, и двойная кавычка интерпретируется как разделитель строк.
- Если за нечётным числом обратных слэшей следует двойная кавычка, один обратный слэш помещается в массив argv за каждую пару обратных слэшей, и двойная кавычка "экранируется" оставшимся обратным слэшем, помещая в argv символ двойной кавычки (").
В системах Posix она использует следующие правила разбора: компоненты разделяются пробелами, если пробел не находится внутри
"или'кавычек.См. также:
Исходный код Редактировать proc paramCount(): int {...}{.tags: [ReadIOEffect], raises: [].}-
Возвращает количество аргументов командной строки, переданных приложению.
В отличие от argc в C, если ваш двоичный файл был вызван без параметров, это вернёт ноль. Вы можете запросить каждый отдельный параметр с помощью процедуры paramStr или получить все сразу с помощью процедуры commandLineParams.
Доступность: При генерации динамической библиотеки (см.
--app:lib) в Posix эта процедура не определена. Проверьте доступность с помощью declared().См. также:
Примеры:
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: [].}-
Возвращает имя файла исполняемого файла приложения. Эта процедура разрешает символические ссылки.
См. также:
Исходный код Редактировать proc getAppDir(): string {...}{.gcsafe, extern: "nos$1", tags: [ReadIOEffect], raises: [].}-
Возвращает каталог исполняемого файла приложения.
См. также:
Исходный код Редактировать 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генерируется.См. также:
Исходный код Редактировать proc getFileInfo(file: File): FileInfo {...}{.raises: [IOError, OSError], tags: [].}-
Получает информацию о файле для объекта файла.
См. также:
Исходный код Редактировать proc getFileInfo(path: string; followSymlink = true): FileInfo {...}{. raises: [OSError], tags: [].}-
Получает информацию о файле для объекта файла, указанного по
path.Из-за отличий между операционными системами, информация в возвращаемом объекте FileInfo будет немного отличаться в разных платформах, а в некоторых случаях - неполной или неточной.
Когда
followSymlinkравно true (по умолчанию), символические ссылки отслеживаются, и возвращается информация, относящаяся к целевому объекту символической ссылки. В противном случае, возвращается информация о самой символической ссылке.Если информация не может быть получена, например, когда путь не существует или когда ограничения доступа препятствуют получению информации о файле,
OSErrorбудет сгенерировано.См. также:
Исходный код Редактировать 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: [].}
-
Возвращает текущий идентификатор процесса.
См. также:
Исходный код Редактировать 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 (по умолчанию), исходный аргумент будет включён в обход.Относительные пути этим итератором не будут расширены. Вместо этого он будет перебирать только каталоги, присутствующие в относительном пути.
См. также:
Примеры:
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: [].}-
Перебирает все переменные среды.
В первой компоненте кортежа хранится имя текущей переменной, во второй — её значение.
См. также:
Исходный код Редактировать iterator walkPattern(pattern: string): string {...}{.tags: [ReadDirEffect], raises: [].}-
Перебирает все файлы и каталоги, соответствующие
pattern.В POSIX используется вызов glob.
patternзависит от ОС, но по крайней мере поддерживается запись"*.ext".См. также:
Исходный код Редактировать iterator walkFiles(pattern: string): string {...}{.tags: [ReadDirEffect], raises: [].}-
Перебирает все файлы, соответствующие
pattern.В POSIX используется вызов glob.
patternзависит от ОС, но по крайней мере поддерживается запись"*.ext".См. также:
Исходный код Редактировать iterator walkDirs(pattern: string): string {...}{.tags: [ReadDirEffect], raises: [].}-
Перебирает все каталоги, соответствующие
pattern.В POSIX используется вызов glob.
patternзависит от ОС, но по крайней мере поддерживается запись"*.ext".См. также:
Исходный код Редактировать 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
См. также:
Исходный код Редактировать 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следовать за символическими ссылками на каталоги См. также:
Исходный код Редактировать
Шаблоны
template existsFile(args: varargs[untyped]): untyped {...}{. deprecated: "use fileExists".}- Исходный код Редактировать
template existsDir(args: varargs[untyped]): untyped {...}{. deprecated: "use dirExists".}- Исходный код Редактировать
© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/os.html