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 (администраторы).См. также:
Исходный код Редактировать 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.См. также:
Исходный код Редактировать 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: [].}-
Возвращает каталог исполняемого файла приложения.
См. также:
Исходный код Редактировать proc getAppFilename(): string {....gcsafe, extern: "nos$1", tags: [ReadIOEffect], raises: [], forbids: [].}-
Возвращает имя файла исполняемого файла приложения. Эта процедура разрешает символические ссылки.
Возвращает пустую строку, когда имя недоступно.
См. также:
Исходный код Редактировать proc getCreationTime(file: string): times.Time {....gcsafe, extern: "nos$1", raises: [OSError], tags: [], forbids: [].}-
Возвращает время создания
file.Примечание: В системах POSIX возвращаемое время может фактически быть временем последнего изменения атрибутов файла. Подробнее см. здесь.
См. также:
Исходный код Редактировать proc getCurrentCompilerExe(): string {.compileTime, ...raises: [], tags: [], forbids: [].}-
Возвращает путь к текущему компилятору Nim или исполняемому файлу nimble.
Можно использовать для получения текущего исполняемого файла компилятора Nim из программы Nim или nimscript, или исполняемого файла nimble внутри программы nimble (аналогично с другими бинарными файлами, построенными с помощью API компилятора).
Исходный код Редактировать proc getCurrentProcessId(): int {....raises: [], tags: [], forbids: [].}-
Возвращает идентификатор текущего процесса.
См. также:
Исходный код Редактировать
proc getFileInfo(file: File): FileInfo {....raises: [IOError, OSError], tags: [], forbids: [].}-
Получает информацию о файле для объекта файла.
См. также:
Исходный код Изменить proc getFileInfo(handle: FileHandle): FileInfo {....raises: [OSError], tags: [], forbids: [].}-
Получает информацию о файле для объекта файла, представленного заданным дескриптором.
Если информацию получить не удаётся, например, при некорректном дескрипторе файла, возникает
OSError.См. также:
Исходный код Изменить proc getFileInfo(path: string; followSymlink = true): FileInfo {. ...raises: [OSError], tags: [], forbids: [].}-
Получает информацию о файле, на который указывает
path.Из-за фундаментальных различий между операционными системами информация, содержащаяся в возвращаемом объекте FileInfo, будет немного отличаться на разных платформах, а в некоторых случаях будет неполной или неточной.
Когда
followSymlinkимеет значение true (по умолчанию), символические ссылки отслеживаются, и полученная информация относится к целевому объекту символической ссылки. В противном случае извлекается информация о самой символической ссылке (однако полеisSpecialвсё равно определяется по целевому объекту на Unix).Если информацию получить не удаётся, например, из-за того, что путь не существует или ограничения доступа не позволяют программе получить информацию о файле, возникает
OSError.См. также:
Исходный код Изменить 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.См. также:
Исходный код Изменить proc getLastModificationTime(file: string): times.Time {....gcsafe, extern: "nos$1", raises: [OSError], tags: [], forbids: [].}-
Возвращает время последней модификации файла
file.См. также:
Исходный код Изменить 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.list2cmdlinePython. См. эту ссылку для получения дополнительной информации. proc sameFileContent(path1, path2: string): bool {....gcsafe, extern: "nos$1", tags: [ReadIOEffect], raises: [IOError, OSError], forbids: [].}-
Возвращает true, если оба аргумента пути указывают на файлы с одинаковым двоичным содержимым.
См. также:
Исходный код Изменить 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".}- Исходный код Изменить
template existsFile(args: varargs[untyped]): untyped {. ...deprecated: "use fileExists".}- Исходный код Изменить
© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/os.html