std/private/ospaths2
Исходный кодРедактироватьИмпорты
- since, strutils, pathnorm, oserrors, oscommon, winlean, osseps, ntpath
Процедуры
proc `/`(head, tail: string): string {.noSideEffect, inline, ...raises: [], tags: [], forbids: [].}-
То же самое, что и процедура joinPath(head, tail).
См. также:
- процедура `/../`
- процедура joinPath(head, tail)
- процедура joinPath(parts: varargs[string])
- процедура splitPath
- процедура uri.combine
- процедура uri./
Пример:
when defined(posix): assert "usr" / "" == "usr" assert "" / "lib" == "lib" assert "" / "/lib" == "/lib" assert "usr/" / "/lib/" == "usr/lib/" assert "usr" / "lib" / "../bin" == "usr/bin"
Исходный код Редактировать proc `/../`(head, tail: string): string {.noSideEffect, ...raises: [], tags: [], forbids: [].}-
То же самое, что и
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 absolutePath(path: string; root = getCurrentDir()): string {. ...raises: [ValueError], tags: [], forbids: [].}-
Возвращает абсолютный путь к
path, с корнем вroot(который должен быть абсолютным; по умолчанию - текущая директория). Еслиpathявляется абсолютным, возвращает его, игнорируяroot.См. также:
Пример:
assert absolutePath("a") == getCurrentDir() / "a"Исходный код Редактировать proc addFileExt(filename, ext: string): string {.noSideEffect, ...gcsafe, extern: "nos$1", raises: [], tags: [], forbids: [].}-
Добавляет расширение файла
extкfilename, если уfilenameещё нет расширения.Extдолжно быть указано без ведущего'.', так как некоторые файловые системы могут использовать другой символ. (Хотя мне не известно ни одной такой системы.)См. также:
- процедура searchExtPos
- процедура splitFile
- процедура extractFilename
- процедура lastPathPart
- процедура changeFileExt
Пример:
assert addFileExt("foo.bar", "baz") == "foo.bar" assert addFileExt("foo.bar", "") == "foo.bar" assert addFileExt("foo", "baz") == "foo.baz"Исходный код Редактировать proc changeFileExt(filename, ext: string): string {.noSideEffect, ...gcsafe, extern: "nos$1", raises: [], tags: [], forbids: [].}-
Изменяет расширение файла на
ext.Если у
filenameнет расширения, будет добавленоext. Еслиext== "" то любое расширение удаляется.Extдолжно быть указано без ведущего'.', так как некоторые файловые системы могут использовать другой символ. (Хотя мне не известно ни одной такой системы.)См. также:
- процедура searchExtPos
- процедура splitFile
- процедура extractFilename
- процедура lastPathPart
- процедура addFileExt
Пример:
assert changeFileExt("foo.bar", "baz") == "foo.baz" assert changeFileExt("foo.bar", "") == "foo" assert changeFileExt("foo", "baz") == "foo.baz"Исходный код Редактировать proc cmpPaths(pathA, pathB: string): int {.noSideEffect, ...gcsafe, extern: "nos$1", raises: [], tags: [], forbids: [].}-
Сравнивает два пути.
В случае чувствительной к регистру файловой системы сравнение проводится чувствительно к регистру, иначе - без учёта регистра. Возвращает:
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 extractFilename(path: string): string {.noSideEffect, ...gcsafe, extern: "nos$1", raises: [], tags: [], forbids: [].}-
Извлекает имя файла из заданного
path.Это то же самое, что и
name & extиз процедуры splitFile(path).См. также:
- процедура searchExtPos
- процедура splitFile
- процедура lastPathPart
- процедура changeFileExt
- процедура addFileExt
Пример:
assert extractFilename("foo/bar/") == "" assert extractFilename("foo/bar") == "bar" assert extractFilename("foo/bar.baz") == "bar.baz"Исходный код Редактировать proc getCurrentDir(): string {....gcsafe, extern: "nos$1", tags: [], raises: [OSError], forbids: [].}-
Возвращает текущую рабочую директорию, т.е. директорию, в которой запущена исполняемая программа.
Таким образом, путь, возвращаемый этой процедурой, определяется во время выполнения.
См. также:
- osappdirs: процедура getHomeDir
- osappdirs: процедура getConfigDir
- osappdirs: процедура getTempDir
- osdirs: процедура setCurrentDir
- шаблон currentSourcePath
- процедура getProjectPath
proc isAbsolute(path: string): bool {....gcsafe, noSideEffect, ...extern: "nos$1", raises: [], tags: [], forbids: [].}-
Проверяет, является ли заданный
pathабсолютным.В Windows сетевые пути также считаются абсолютными.
Пример:
assert not "".isAbsolute assert not ".".isAbsolute when defined(posix): assert "/".isAbsolute assert not "a/".isAbsolute assert "/a/".isAbsolute
Исходный код Редактировать proc isRelativeTo(path: string; base: string): bool {....raises: [Exception], tags: [RootEffect], forbids: [].}- Возвращает 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 isRootDir(path: string): bool {.noSideEffect, ...gcsafe, extern: "nos$1", raises: [], tags: [], forbids: [].}- Проверяет, является ли заданный
pathкорневой директорией.Пример:
assert isRootDir("") assert isRootDir(".") assert isRootDir("/") assert isRootDir("a") assert not isRootDir("/a") assert not isRootDir("a/b/c")Исходный код Редактировать
proc joinPath(head, tail: string): string {.noSideEffect, ...gcsafe, extern: "nos$1", raises: [], tags: [], forbids: [].}-
Объединяет два имени каталога в одно.
Возвращает нормализованное объединение путей
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: [], forbids: [].}-
Аналогично 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 lastPathPart(path: string): string {.noSideEffect, ...gcsafe, extern: "nos$1", raises: [], tags: [], forbids: [].}-
Подобно extractFilename proc, но игнорирует конечный разделитель каталога; также известен как baseName на некоторых других языках.
См. также:
Пример:
assert lastPathPart("foo/bar/") == "bar" assert lastPathPart("foo/bar") == "bar"Исходный код Редактировать proc normalizedPath(path: string): string {....gcsafe, extern: "nos$1", tags: [], raises: [], forbids: [].}-
Возвращает нормализованный путь для текущей ОС.
См. также:
- absolutePath proc
- normalizePath proc для версии, изменяющей объект напрямую
Пример:
when defined(posix): assert normalizedPath("a///b//..//c///d") == "a/c/d"Исходный код Редактировать proc normalizeExe(file: var string) {....raises: [], tags: [], forbids: [].}- в POSIX, добавляет
./в начало, еслиfileне содержит/и не является"", ".", "..".Пример:
import std/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: [], forbids: [].}-
Нормализует путь.
Последовательные разделители каталогов сворачиваются, включая начальный двойной слэш.
Для относительных путей последовательности двойной точки (
..) сворачиваются при возможности. Для абсолютных путей они всегда сворачиваются.Предупреждение: URL-кодированные и Unicode-попытки обхода защиты каталога не обнаруживаются. Тройная точка не обрабатывается.См. также:
- absolutePath proc
- normalizedPath proc для версии, не изменяющей исходный объект
- normalizeExe proc
Пример:
when defined(posix): var a = "a///b//..//c///d" a.normalizePath() assert a == "a/c/d"
Исходный код Редактировать proc normalizePathEnd(path: string; trailingSep = false): string {....raises: [], tags: [], forbids: [].}- перегрузка, возвращающая новый объект
Пример:
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 normalizePathEnd(path: var string; trailingSep = false) {....raises: [], tags: [], forbids: [].}- Обеспечивает, что
pathимеет ровно 0 или 1 конечныйDirSep, в зависимости отtrailingSep, и учитывает крайние случаи: сохраняет, является ли путь абсолютным или относительным, и гарантирует, что конечный разделитель – этоDirSep, а неAltSep. Конечные/.сжимаются, см. примеры. Исходный код Редактировать proc parentDir(path: string): string {.noSideEffect, ...gcsafe, extern: "nos$1", raises: [], tags: [], forbids: [].}-
Возвращает родительский каталог
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 relativePath(path, base: string; sep = DirSep): string {....gcsafe, extern: "nos$1", raises: [Exception], tags: [RootEffect], forbids: [].}-
Преобразует
pathв путь, относительный кbase.Разделитель каталогов
sep(по умолчанию: osseps: 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" when not doslikeFileSystem: # On Windows, UNC-paths start with `//` 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 sameFile(path1, path2: string): bool {....gcsafe, extern: "nos$1", tags: [ReadDirEffect], raises: [OSError], forbids: [].}-
Возвращает true, если оба аргумента пути указывают на один и тот же физический файл или каталог.
Вызывает
OSErrorесли любой из файлов не существует или информация о нём недоступна.Эта процедура вернет true, если ей переданы два альтернативных жестких ссылки или символических ссылки на один и тот же файл или каталог.
См. также:
Исходный код Редактировать
proc searchExtPos(path: string): int {....raises: [], tags: [], forbids: [].}-
Возвращает индекс символа
'.'вpath, если он обозначает начало расширения файла. В противном случае возвращает -1.См. также:
- процедура splitFile
- процедура extractFilename
- процедура lastPathPart
- процедура changeFileExt
- процедура addFileExt
Пример:
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 assert searchExtPos(".nim") == -1 assert searchExtPos("..nim") == -1 assert searchExtPos("a..nim") == 2Исходный код Редактировать proc splitFile(path: string): tuple[dir, name, ext: string] {.noSideEffect, ...gcsafe, extern: "nos$1", raises: [], tags: [], forbids: [].}-
Разделяет имя файла на кортеж
(dir, name, extension).dirне заканчивается на osseps: DirSep, если это не/.extensionвключает ведущую точку.Если у
pathнет расширения,ext— пустая строка. Если уpathнет компоненты каталога,dir— пустая строка. Если уpathнет компоненты имени файла,nameиext— пустые строки.См. также:
- процедура searchExtPos
- процедура extractFilename
- процедура lastPathPart
- процедура changeFileExt
- процедура addFileExt
Пример:
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 splitPath(path: string): tuple[head, tail: string] {.noSideEffect, ...gcsafe, extern: "nos$1", raises: [], tags: [], forbids: [].}-
Разделяет каталог на
(head, tail)кортеж, так чтоhead / tail == path(кроме крайних случаев, таких как "/usr").См. также:
- процедура joinPath(head, tail)
- процедура joinPath(parts)
- / процедура
- /../ процедура
- процедура relativePath
Пример:
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 tailDir(path: string): string {.noSideEffect, ...gcsafe, extern: "nos$1", raises: [], tags: [], forbids: [].}-
Возвращает хвостовую часть
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 unixToNativePath(path: string; drive = ""): string {.noSideEffect, ...gcsafe, extern: "nos$1", raises: [], tags: [], forbids: [].}-
Преобразует путь в стиле UNIX в локальный.
В UNIX-системах ничего не делает. В противном случае преобразует
'/','.','..'в соответствующие значения.В системах с концепцией «дисков»
Исходный код Редактироватьdriveиспользуется для определения метки диска, которую следует использовать при преобразовании абсолютного пути.driveпо умолчанию соответствует диску текущего рабочего каталога и игнорируется в системах, не имеющих концепции «дисков».
Итераторы
iterator parentDirs(path: string; fromRoot = false; inclusive = true): string {. ...raises: [], tags: [], forbids: [].}-
Проходит по всем родительским каталогам заданного
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
Исходный код Редактировать
© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/ospaths2.html