Spec-Zone.ru › Elixir 1.18

Исходный код Путь

Этот модуль предоставляет удобные функции для работы с путями к файлам в файловой системе.

Функции в этом модуле могут принимать данные символов в качестве аргументов и всегда возвращают строку, закодированную в UTF-8. Данные символов — это строка или список символов и строк, см. IO.chardata/0. Если предоставлен двоичный файл, в каком бы кодировании он ни был, его кодирование сохранится.

Большинство функций в этом модуле не взаимодействуют с файловой системой, за исключением нескольких функций, которые требуют этого (например, wildcard/2 и expand/1).

Краткое описание

Типы

t()

Путь.

Функции

absname(путь)

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

absname(путь, относительно)

Создаёт путь от relative_to до path.

basename(путь)

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

basename(путь, расширение)

Возвращает последнюю часть path с удалённым extension.

dirname(путь)

Возвращает компонент каталога path.

expand(путь)

Преобразует путь в абсолютный, расширяя любые . и .. компоненты и ведущий ~.

expand(путь, относительно)

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

extname(путь)

Возвращает расширение последней части path.

join(список)

Объединяет список путей.

join(левый, правый)

Объединяет два пути.

relative(имя)

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

relative_to(путь, текущая_директория, опции \\ [])

Возвращает прямой относительный путь от path по отношению к cwd.

relative_to_cwd(путь, опции \\ [])

Удобный способ получить путь, относительный к текущей рабочей директории.

rootname(путь)

Возвращает path с удалённым extension.

rootname(путь, расширение)

Возвращает path с удалённым extension.

safe_relative(путь, текущая_директория \\ File.cwd!())

Возвращает относительный путь, защищённый от атак перехода каталогов.

safe_relative_to(путь, текущая_директория) устаревшая

Возвращает относительный путь, защищённый от атак перехода каталогов.

split(путь)

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

type(имя)

Возвращает тип пути.

wildcard(шаблон, опции \\ [])

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

Типы

t()Исходный код

@type t() :: IO.chardata()

Путь.

END_OF_DOCUMENT_MARKER

Функции

absname(path)Source

@spec absname(t()) :: binary()

Преобразует заданный путь к абсолютному.

В отличие от expand/1, не пытается разрешить .., ., или ~.

Примеры

Операционные системы семейства Unix

Path.absname("foo")
#=> "/usr/local/foo"

Path.absname("../x")
#=> "/usr/local/../x"

Windows

Path.absname("foo")
#=> "D:/usr/local/foo"

Path.absname("../x")
#=> "D:/usr/local/../x"

absname(path, relative_to)Source

@spec absname(t(), t() | (-> t())) :: binary()

Создаёт путь от relative_to к path.

Если path уже является абсолютным путём, relative_to игнорируется. См. также relative_to/3. relative_to — это либо путь, либо анонимная функция, которая вызывается только при необходимости и возвращает путь.

В отличие от expand/2, не пытается разрешить .., . или ~.

Примеры

iex> Path.absname("foo", "bar")
"bar/foo"

iex> Path.absname("../x", "bar")
"bar/../x"

iex> Path.absname("foo", fn -> "lazy" end)
"lazy/foo"

basename(path)Source

@spec basename(t()) :: binary()

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

Примеры

iex> Path.basename("foo")
"foo"

iex> Path.basename("foo/bar")
"bar"

iex> Path.basename("lib/module/submodule.ex")
"submodule.ex"

iex> Path.basename("/")
""

basename(path, extension)Source

@spec basename(t(), t()) :: binary()

Возвращает последнюю компоненту path с удалённым extension.

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

Примеры

iex> Path.basename("~/foo/bar.ex", ".ex")
"bar"

iex> Path.basename("~/foo/bar.exs", ".ex")
"bar.exs"

iex> Path.basename("~/foo/bar.old.ex", ".ex")
"bar.old"

dirname(path)Source

@spec dirname(t()) :: binary()

Возвращает компонент каталога path.

Примеры

iex> Path.dirname("/foo/bar.ex")
"/foo"

iex> Path.dirname("/foo/bar/baz.ex")
"/foo/bar"

iex> Path.dirname("/foo/bar/")
"/foo/bar"

iex> Path.dirname("bar.ex")
"."

expand(path)Source

@spec expand(t()) :: binary()

Преобразует путь к абсолютному, расширяя любые . и .. компоненты и начальный ~.

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

Примеры

Path.expand("/foo/bar/../baz")
#=> "/foo/baz"

Path.expand("foo/bar/../baz")
#=> "$PWD/foo/baz"

expand(path, relative_to)Source

@spec expand(t(), t()) :: binary()

Расширяет путь относительно пути, указанного во втором аргументе, расширяя любые . и .. символы.

Если путь уже является абсолютным, relative_to игнорируется.

Обратите внимание, что эта функция рассматривает path с начальным ~ как абсолютный.

Второй аргумент сначала расширяется до абсолютного пути.

Примеры

# Assuming that the absolute path to baz is /quux/baz
Path.expand("foo/bar/../bar", "baz")
#=> "/quux/baz/foo/bar"

Path.expand("foo/bar/../bar", "/baz")
#=> "/baz/foo/bar"

Path.expand("/foo/bar/../bar", "/baz")
#=> "/foo/bar"

extname(path)Source

@spec extname(t()) :: binary()

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

Для имён файлов, начинающихся с точки и не имеющих расширения, возвращает пустую строку.

См. basename/1 и rootname/1 для функций, связанных с извлечением информации из путей.

Примеры

iex> Path.extname("foo.erl")
".erl"

iex> Path.extname("~/foo/bar")
""

iex> Path.extname(".gitignore")
""

join(list)Source

@spec join([t(), ...]) :: binary()

Объединяет список путей.

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

Вызывает ошибку, если заданный список путей пуст.

Примеры

iex> Path.join(["~", "foo"])
"~/foo"

iex> Path.join(["foo"])
"foo"

iex> Path.join(["/", "foo", "bar/"])
"/foo/bar"

join(left, right)Source

@spec join(t(), t()) :: binary()

Объединяет два пути.

Правый путь всегда будет преобразован в относительный формат, и любые хвостовые слэши будут удалены при объединении.

Примеры

iex> Path.join("foo", "bar")
"foo/bar"

iex> Path.join("/foo", "/bar/")
"/foo/bar"

Функции в этом модуле поддерживают chardata, поэтому передача списка будет обрабатывать его как единое целое:

iex> Path.join("foo", ["bar", "fiz"])
"foo/barfiz"

iex> Path.join(["foo", "bar"], "fiz")
"foobar/fiz"

Используйте join/1, если вам нужно объединить список путей вместо этого.

relative(name)Source

@spec relative(t()) :: binary()

Принудительно устанавливает путь как относительный.

Если задан абсолютный путь, его компонент корня удаляется.

Примеры

Операционные системы семейства Unix

Path.relative("/usr/local/bin")   #=> "usr/local/bin"
Path.relative("usr/local/bin")    #=> "usr/local/bin"
Path.relative("../usr/local/bin") #=> "../usr/local/bin"

Windows

Path.relative("D:/usr/local/bin") #=> "usr/local/bin"
Path.relative("usr/local/bin")    #=> "usr/local/bin"
Path.relative("D:bar.ex")         #=> "bar.ex"
Path.relative("/bar/foo.ex")      #=> "bar/foo.ex"

relative_to(path, cwd, opts \\ [])Source

@spec relative_to(t(), t(), keyword()) :: binary()

Возвращает прямой относительный путь от path по отношению к cwd.

Другими словами, эта функция пытается вернуть путь, такой что Path.expand(result, cwd) указывает на path . Эта функция стремится вернуть относительный путь, когда это возможно, но это не гарантируется:

  • Если оба пути относительные, всегда возвращается относительный путь

  • Если оба пути абсолютные, может быть возвращён относительный путь, если они имеют общий префикс. Вы можете передать опцию :force , чтобы заставить эту функцию перемещаться вверх, но даже тогда относительный путь не гарантируется (например, если абсолютные пути относятся к разным дискам в Windows)

  • Если заданы пути смешанного типа, результат всегда будет соответствовать заданному path (первый аргумент)

Эта функция расширяет . и .. записи без обхода файловой системы, поэтому она предполагает отсутствие символьных ссылок между путями. См. safe_relative_to/2 для более безопасной альтернативы.

Опции

  • :force - (булево начиная с v1.16.0) если true принудительно заставляет относительный путь возвращаться путём перемещения вверх по пути. За исключением случаев, когда пути находятся на разных томах в Windows. По умолчанию false.

Примеры

С относительной рабочей директорией

Если оба пути относительные, вычисляется минимальный путь:

Path.relative_to("tmp/foo/bar", "tmp")      #=> "foo/bar"
Path.relative_to("tmp/foo/bar", "tmp/foo")  #=> "bar"
Path.relative_to("tmp/foo/bar", "tmp/bat")  #=> "../foo/bar"

Если задан абсолютный путь с относительной рабочей директорией, он возвращается как:

Path.relative_to("/usr/foo/bar", "tmp/bat")  #=> "/usr/foo/bar"

С абсолютной рабочей директорией

Если оба пути абсолютные, относительный путь вычисляется, если возможно, без перемещения вверх:

Path.relative_to("/usr/local/foo", "/usr/local")      #=> "foo"
Path.relative_to("/usr/local/foo", "/")               #=> "usr/local/foo"
Path.relative_to("/usr/local/foo", "/etc")            #=> "/usr/local/foo"
Path.relative_to("/usr/local/foo", "/usr/local/foo")  #=> "."
Path.relative_to("/usr/local/../foo", "/usr/foo")     #=> "."
Path.relative_to("/usr/local/../foo/bar", "/usr/foo") #=> "bar"

Если :force установлено на true , пути перемещаются вверх:

Path.relative_to("/usr", "/usr/local", force: true)          #=> ".."
Path.relative_to("/usr/foo", "/usr/local", force: true)      #=> "../foo"
Path.relative_to("/usr/../foo/bar", "/etc/foo", force: true) #=> "../../foo/bar"

Если задан относительный путь, он предполагается относительным к заданному пути, поэтому путь возвращается с "." и ".." расширенными:

Path.relative_to(".", "/usr/local")          #=> "."
Path.relative_to("foo", "/usr/local")        #=> "foo"
Path.relative_to("foo/../bar", "/usr/local") #=> "bar"
Path.relative_to("foo/..", "/usr/local")     #=> "."
Path.relative_to("../foo", "/usr/local")     #=> "../foo"

relative_to_cwd(path, opts \\ [])Source

@spec relative_to_cwd(
  t(),
  keyword()
) :: binary()

Удобный способ получить путь относительно текущей рабочей директории.

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

См. relative_to/3 для поддерживаемых опций.

rootname(path)Source

@spec rootname(t()) :: binary()

Возвращает path с удалённым extension.

Примеры

iex> Path.rootname("/foo/bar")
"/foo/bar"

iex> Path.rootname("/foo/bar.ex")
"/foo/bar"

rootname(path, extension)Source

@spec rootname(t(), t()) :: binary()

Возвращает path с удалённым extension.

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

Примеры

iex> Path.rootname("/foo/bar.erl", ".erl")
"/foo/bar"

iex> Path.rootname("/foo/bar.erl", ".ex")
"/foo/bar.erl"

safe_relative(path, cwd \\ File.cwd!())Source

@spec safe_relative(t(), t()) :: {:ok, binary()} | :error

Возвращает относительный путь, защищённый от атак перехода через директории.

Указанный относительный путь очищается путём удаления .. и . компонентов.

Эта функция проверяет, что после расширения этих компонентов путь по-прежнему «безопасен». Пути считаются небезопасными, если истинно хотя бы одно из следующих условий:

  • Путь не является относительным, например "/foo/bar".

  • Компонент .. может привести к тому, что путь будет выходить за пределы корня relative_to.

  • Символическая ссылка в пути указывает на элемент выше корня cwd.

Примеры

iex> Path.safe_relative("foo")
{:ok, "foo"}

iex> Path.safe_relative("deps/my_dep/app.beam")
{:ok, "deps/my_dep/app.beam"}

iex> Path.safe_relative("deps/my_dep/./build/../app.beam", File.cwd!())
{:ok, "deps/my_dep/app.beam"}

iex> Path.safe_relative("my_dep/../..")
:error

iex> Path.safe_relative("/usr/local", File.cwd!())
:error

safe_relative_to(path, cwd)Source

Данная функция устаревшая. Используйте safe_relative/2 вместо неё.
@spec safe_relative_to(t(), t()) :: {:ok, binary()} | :error

Возвращает относительный путь, защищённый от атак перехода через директории.

См. safe_relative/2 для не устаревшей версии этого API.

split(path)Source

@spec split(t()) :: [binary()]

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

Если передана пустая строка, возвращает пустой список.

В Windows путь разделяется на "\" и "/" разделители, а буква диска, если она есть, всегда возвращается в нижнем регистре.

Примеры

iex> Path.split("")
[]

iex> Path.split("foo")
["foo"]

iex> Path.split("/foo/bar")
["/", "foo", "bar"]

type(name)Source

@spec type(t()) :: :absolute | :relative | :volumerelative

Возвращает тип пути.

Примеры

Операционные системы семейства Unix

Path.type("/")                #=> :absolute
Path.type("/usr/local/bin")   #=> :absolute
Path.type("usr/local/bin")    #=> :relative
Path.type("../usr/local/bin") #=> :relative
Path.type("~/file")           #=> :relative

Windows

Path.type("D:/usr/local/bin") #=> :absolute
Path.type("usr/local/bin")    #=> :relative
Path.type("D:bar.ex")         #=> :volumerelative
Path.type("/bar/foo.ex")      #=> :volumerelative

wildcard(glob, opts \\ [])Source

@spec wildcard(
  t(),
  keyword()
) :: [binary()]

Проходит по путям в соответствии с заданным выражением glob и возвращает список совпадений.

Маска похожа на обычный путь, за исключением следующих «символов подстановки», которые интерпретируются особым образом:

  • ? - соответствует одному символу.

  • * - соответствует любому количеству символов до конца имени файла, следующей точки или следующего слэша.

  • ** - два смежных символа * в качестве единственного шаблона соответствует всем файлам и нулю или более директориям и поддиректориям.

  • [char1,char2,...] - соответствует любому из перечисленных символов; два символа, разделённые дефисом, будут соответствовать диапазону символов. Не добавляйте пробелы до и после запятой, так как в противном случае это будет соответствовать путям, содержащим пробел.

  • {item1,item2,...} - соответствует одному из вариантов. Не добавляйте пробелы до и после запятой, так как в противном случае это будет соответствовать путям, содержащим пробел.

Другие символы представляют собой сами себя. Только пути, в которых соответствующий символ находится в той же позиции, будут соответствовать. Обратите внимание, что соответствие регистрозависимо: "a" не будет соответствовать "A".

Разделители каталогов всегда должны быть записаны как /, даже в Windows. Вы можете вызвать Path.expand/1 для нормализации пути перед вызовом этой функции.

Символ, предваряемый \\ , теряет своё специальное значение. Обратите внимание, что \\ должно быть записано как \\\\ в строковой литерале. Например, "\\\\?*" будет соответствовать любому имени файла, начинающемуся с ?..

По умолчанию, шаблоны * и ? не соответствуют файлам, начинающимся с точки .. См. опцию :match_dot в разделе «Опции» ниже.

Опции

  • :match_dot - (boolean) если false, специальные символы подстановки * и ? не будут соответствовать файлам, начинающимся с точки (.). Если true, файлы, начинающиеся с . , не будут обрабатываться специально. По умолчанию false.

Примеры

Представьте, что у вас есть каталог под названием projects с тремя проектами Elixir внутри: elixir, ex_doc, и plug. Вы можете найти все .beam файлы внутри каталога ebin каждого проекта следующим образом:

Path.wildcard("projects/*/ebin/**/*.beam")

Если вам нужно найти файлы как .beam , так и .app, вы можете сделать следующее:

Path.wildcard("projects/*/ebin/**/*.{beam,app}")

Скачать версию ePub

Создано с помощью ExDoc (v0.36.1) для программного языка Elixir

© 2012-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.18.1/Path.html

Spec-Zone.ru

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