Spec-Zone.ru › Nim

std/os

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

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

Пример:

import std/os
let myFile = "/path/to/my/file.nim"
assert splitPath(myFile) == (head: "/path/to/my", tail: "file.nim")
when defined(posix):
  assert parentDir(myFile) == "/path/to/my"
assert splitFile(myFile) == (dir: "/path/to/my", name: "file", ext: ".nim")
assert myFile.changeFileExt("c") == "/path/to/my/file.c"
См. также:
  • модули paths и files для высокоуровневой работы с файлами
  • модуль osproc для межпроцессного взаимодействия, выходящего за рамки процедуры execShellCmd
  • модуль uri
  • модуль distros
  • модуль dynlib
  • модуль streams

Импорты

ospaths2, osfiles, osdirs, ossymlinks, osappdirs, oscommon, since, cmdline, strutils, pathnorm, winlean, times, oserrors, envvars, osseps

Типы

DeviceId = int32
Исходный код Редактировать
FileId = int64
Исходный код Редактировать
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!
  blockSize*: int            ## Preferred I/O block size for this object.
                             ## In some filesystems, this may vary from file to file.
  isSpecial*: bool           ## Is file special? (on Unix some "files"
                             ## can be special=non-regular like FIFOs,
                             ## devices); for directories `isSpecial`
                             ## is always `false`, for symlinks it is
                             ## the same as for the link's target.

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

См. также:

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

Константы

ExeExts = ["exe", "cmd", "bat"]
Платформозависимое расширение файла для исполняемых файлов. В Windows ["exe", "cmd", "bat"], в Posix [""]. Исходный код Редактировать
invalidFilenameChars = {'/', '\\', ':', '*', '?', '\"', '<', '>', '|', '^',
                        '\x00'}
Символы, которые могут привести к недопустимым именам файлов в Linux, Windows и Mac. Вы можете проверить, содержит ли ваше имя файла какие-либо из этих символов, и удалить их для безопасности. Mac запрещает ':', 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, Mac и т. д. Вы можете проверить, соответствует ли ваше имя файла этим, и переименовать его для безопасности (в настоящее время все недопустимые имена файлов — только из Windows). Исходный код Редактировать

Процедуры

proc createHardlink(src, dest: string) {....raises: [OSError], tags: [],
    forbids: [].}
Создать жёсткую ссылку в dest, которая указывает на элемент, указанный в src.
Предупреждение: Некоторые ОС ограничивают создание жёстких ссылок для пользователей с правами root (администраторы).

См. также:

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

Удобная процедура для:

setFilePermissions(filename, getFilePermissions(filename)-permissions)
Исходный код Редактировать
proc execShellCmd(command: string): int {....gcsafe, extern: "nos$1",
    tags: [ExecIOEffect], raises: [], forbids: [].}

Исполняет командную строку оболочки.

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

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

Примеры:

discard execShellCmd("ls -la")
Исходный код Редактировать
proc exitStatusLikeShell(status: cint): cint {....raises: [], tags: [], forbids: [].}
Преобразует код завершения из c_system в код завершения оболочки. Исходный код Редактировать
proc expandFilename(filename: string): string {....gcsafe, extern: "nos$1",
    tags: [ReadDirEffect], raises: [OSError], forbids: [].}

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

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

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

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

Windows: данная поддержка сохранена, несмотря на то, что Windows не использует данную соглашение; кроме того, обрабатываются как ~/, так и ~\.

См. также:

  • appdirs: процедура getHomeDir
  • appdirs: процедура getConfigDir
  • appdirs: процедура getTempDir
  • ospaths2: процедура getCurrentDir
  • dirs: процедура setCurrentDir

Пример:

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

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

См. также:

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

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

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

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

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

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

См. также:

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

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

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

См. также:

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

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

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

См. также:

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

Возвращает путь к текущему компилятору Nim или исполняемому файлу nimble.

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

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

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

См. также:

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

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

См. также:

  • getFileInfo(handle) proc
  • getFileInfo(path, followSymlink) proc
Исходный код Изменить
proc getFileInfo(handle: FileHandle): FileInfo {....raises: [OSError], tags: [],
    forbids: [].}

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

Если информацию получить не удаётся, например, при некорректном дескрипторе файла, возникает OSError.

См. также:

  • getFileInfo(file) proc
  • getFileInfo(path, followSymlink) proc
Исходный код Изменить
proc getFileInfo(path: string; followSymlink = true): FileInfo {.
    ...raises: [OSError], tags: [], forbids: [].}

Получает информацию о файле, на который указывает path.

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

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

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

См. также:

  • getFileInfo(handle) proc
  • getFileInfo(file) proc
Исходный код Изменить
proc getFileSize(file: string): BiggestInt {....gcsafe, extern: "nos$1",
    tags: [ReadIOEffect], raises: [OSError], forbids: [].}
Возвращает размер файла file (в байтах). В случае ошибки возникает OSError. Исходный код Изменить
proc getLastAccessTime(file: string): times.Time {....gcsafe, extern: "nos$1",
    raises: [OSError], tags: [], forbids: [].}

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

См. также:

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

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

См. также:

  • getLastAccessTime proc
  • getCreationTime proc
  • fileNewer proc
Исходный код Изменить
proc inclFilePermissions(filename: string; permissions: set[FilePermission]) {.
    ...gcsafe, extern: "nos$1", tags: [ReadDirEffect, WriteDirEffect],
    raises: [OSError], forbids: [].}

Удобный proc для:

setFilePermissions(filename, getFilePermissions(filename)+permissions)
Исходный код Изменить
proc isAdmin(): bool {....raises: [OSError, OSError], tags: [], forbids: [].}
Возвращает true, если вызывающий процесс является членом локальной группы администраторов (в Windows) или имеет права root (в POSIX), через geteuid() == 0. Исходный код Изменить
proc isHidden(path: string): bool {....raises: [], tags: [], forbids: [].}

Определяет, является ли 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
Исходный код Изменить
func isValidFilename(filename: string; maxLen = 259.Positive): bool {.
    ...raises: [], tags: [], forbids: [].}

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

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

См. также:

  • https://docs.microsoft.com/en-us/dotnet/api/system.io.pathtoolongexception
  • https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file
  • https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx
Предупреждение: Это проверяет только имена файлов, а не целые пути (поскольку на Linux вы можете смонтировать что угодно как путь).

Пример:

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)
assert not isValidFilename("")         # Empty string
assert not isValidFilename("foo/")     # Filename is empty
Исходный код Изменить
proc quoteShell(s: string): string {.noSideEffect, ...gcsafe, extern: "nosp$1",
                                     raises: [], tags: [], forbids: [].}

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

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

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

Пример:

when defined(posix):
  assert quoteShellCommand(["aaa", "", "c d"]) == "aaa '' 'c d'"
when defined(windows):
  assert quoteShellCommand(["aaa", "", "c d"]) == "aaa \"\" \"c d\""
Исходный код Изменить
proc quoteShellPosix(s: string): string {.noSideEffect, ...gcsafe,
    extern: "nosp$1", raises: [], tags: [], forbids: [].}
Приводит s в кавычки, чтобы его можно было безопасно передать в оболочку POSIX. Исходный код Изменить
proc quoteShellWindows(s: string): string {.noSideEffect, ...gcsafe,
    extern: "nosp$1", raises: [], tags: [], forbids: [].}

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

Основано на subprocess.list2cmdline Python. См. эту ссылку для получения дополнительной информации.

Исходный код Изменить
proc sameFileContent(path1, path2: string): bool {....gcsafe, extern: "nos$1",
    tags: [ReadIOEffect], raises: [IOError, OSError], forbids: [].}

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

См. также:

  • ospaths2: sameFile proc
Исходный код Изменить
proc setLastModificationTime(file: string; t: times.Time) {....raises: [OSError],
    tags: [], forbids: [].}
Устанавливает время последней модификации файла file. В случае ошибки возникает OSError. Исходный код Изменить
proc sleep(milsecs: int) {....gcsafe, extern: "nos$1", tags: [TimeEffect],
                           raises: [], forbids: [].}
Отдыхает milsecs миллисекунд. Отрицательное значение milsecs заставляет функцию вернуть управление немедленно. Исходный код Изменить

Шаблоны

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

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

Spec-Zone.ru

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