Файл
Этот модуль содержит функции для работы с файлами.
Некоторые из этих функций являются низкоуровневыми, позволяя пользователю взаимодействовать с файлами или устройствами ввода-вывода, например, open/2, copy/3 и другие. Этот модуль также предоставляет функции высокого уровня, работающие с именами файлов и имеющие имена, основанные на вариантах Unix. Например, можно скопировать файл с помощью cp/3 и удалить файлы и каталоги рекурсивно с помощью rm_rf/1.
Пути, передаваемые функциям в этом модуле, могут быть относительными к текущей рабочей директории (как возвращается File.cwd/0), или абсолютными путями. Оболочки, такие как ~, не расширяются автоматически. Чтобы использовать пути, такие как ~/Downloads, можно использовать Path.expand/1 или Path.expand/2 для расширения пути до абсолютного пути.
Кодировка
Для записи и чтения файлов необходимо использовать функции модуля IO. По умолчанию файл открывается в двоичном режиме, для взаимодействия с файлом требуются функции IO.binread/2 и IO.binwrite/2. Разработчик может передать :utf8 в качестве параметра при открытии файла, тогда будут использоваться более медленные функции IO.read/2 и IO.write/2, которые отвечают за правильные преобразования и гарантируют корректность данных.
Обратите внимание, что имена файлов, заданные как списки символов в Elixir, всегда обрабатываются как UTF-8. В частности, ожидается, что оболочка и операционная система настроены на использование кодировки UTF-8. Двоичные имена файлов считаются сырыми и передаются операционной системе как есть.
API
Большинство функций в этом модуле возвращают :ok или {:ok, result} в случае успеха, {:error, reason} в противном случае. Эти функции также имеют вариант, который заканчивается !, который возвращает результат (вместо кортежа {:ok, result} ) в случае успеха или поднимает исключение в случае неудачи. Например:
File.read("hello.txt")
#=> {:ok, "World"}
File.read("invalid.txt")
#=> {:error, :enoent}
File.read!("hello.txt")
#=> "World"
File.read!("invalid.txt")
#=> raises File.Error
В общем случае, разработчик должен использовать первый вариант, если хочет отреагировать, если файла не существует. Второй вариант следует использовать, когда разработчик ожидает, что его программа завершится неудачей, если файл не может быть прочитан (то есть это фактически исключение).
Процессы и сырые файлы
Каждый раз, когда файл открывается, Elixir запускает новый процесс. Запись в файл эквивалентна отправке сообщений процессу, который записывает в дескриптор файла.
Это означает, что файлы могут передаваться между узлами, а гарантии обмена сообщениями гарантируют, что они могут записывать в один и тот же файл в сети.
Однако, возможно, не всегда стоит платить за эту абстракцию. В таких случаях файл может быть открыт в :raw режиме. Параметры :read_ahead и :delayed_write также полезны при работе с большими файлами или при работе с файлами в тесных циклах.
См. :file.open/2 для получения дополнительной информации о таких параметрах и других соображениях по производительности.
Краткое описание
Типы
Функции
- cd(path)
Устанавливает текущий рабочий каталог.
- cd!(path)
То же самое, что и
cd/1, но если операция завершается неудачно, генерирует исключениеFile.Error.- cd!(path, function)
Изменяет текущий каталог на указанный
path, выполняет заданную функцию, а затем возвращает предыдущий путь, независимо от того, возникло ли исключение.- chgrp(path, gid)
Изменяет группу, заданную идентификатором группы
gidдля указанногоfile. Возвращает:okпри успехе или{:error, reason}при неудаче.- chgrp!(path, gid)
Аналогично
chgrp/2, но генерирует исключениеFile.Errorв случае неудачи. В противном случае:ok.- chmod(path, mode)
Изменяет
modeдля данногоfile.- chmod!(path, mode)
То же самое, что и
chmod/2, но генерирует исключениеFile.Errorв случае неудачи. В противном случае:ok.- chown(path, uid)
Изменяет владельца, заданного идентификатором пользователя
uidдля данногоfile. Возвращает:okпри успехе или{:error, reason}при неудаче.- chown!(path, uid)
То же самое, что и
chown/2, но генерирует исключениеFile.Errorв случае неудачи. В противном случае:ok.- close(io_device)
Закрывает файл, на который ссылается
io_device. В основном возвращает:ok, за исключением некоторых серьезных ошибок, таких как недостаток памяти.- copy(source, destination, bytes_count \\ :infinity)
Копирует содержимое
sourceвdestination.- copy!(source, destination, bytes_count \\ :infinity)
То же самое, что и
copy/3, но если операция завершается неудачно, генерирует исключениеFile.CopyError. В противном случае возвращаетbytes_copied.- cp(source_file, destination_file, options \\ [])
Копирует содержимое
source_fileвdestination_fileсохраняя его режимы.- cp!(source_file, destination_file, options \\ [])
То же самое, что и
cp/3, но если операция завершается неудачно, генерирует исключениеFile.CopyError. В противном случае возвращает:ok.- cp_r(source, destination, options \\ [])
Рекурсивно копирует содержимое
sourceвdestination, сохраняя структуру каталогов и режимы источника.- cp_r!(source, destination, options \\ [])
То же самое, что и
cp_r/3, но если операция завершается неудачно, генерирует исключениеFile.CopyError. В противном случае возвращает список скопированных файлов.- cwd()
Получает текущий рабочий каталог.
- cwd!()
То же самое, что и
cwd/0, но если операция завершается неудачно, генерирует исключениеFile.Error.- dir?(path, opts \\ [])
Возвращает
trueесли указанный путь является каталогом.- exists?(path, opts \\ [])
Возвращает
trueесли указанный путь существует.- ln(existing, new)
Создаёт жёсткую ссылку
newна файлexisting.- ln!(existing, new)
Аналогично
ln/2, но генерирует исключениеFile.LinkErrorв случае неудачи. В противном случае возвращает:ok.- ln_s(existing, new)
Создаёт символическую ссылку
newна файл или каталогexisting.- ln_s!(existing, new)
То же самое, что и
ln_s/2, но генерирует исключениеFile.LinkErrorв случае неудачи. В противном случае возвращает:ok.- ls(path \\ ".")
Возвращает список файлов в указанном каталоге.
- ls!(path \\ ".")
То же самое, что и
ls/1, но генерирует исключениеFile.Errorв случае ошибки.- lstat(path, opts \\ [])
Возвращает информацию об
path. Если файл является символической ссылкой, устанавливаетtypeна:symlinkи возвращает структуруFile.Statдля ссылки. Для любого другого файла возвращает точно такие же значения, какstat/2.- lstat!(path, opts \\ [])
То же самое, что и
lstat/2, но возвращает структуруFile.Statнепосредственно или генерирует исключениеFile.Errorесли возвращается ошибка.- mkdir(path)
Попытка создать каталог
path.- mkdir!(path)
То же самое, что и
mkdir/1, но генерирует исключениеFile.Errorв случае неудачи. В противном случае:ok.- mkdir_p(path)
Попытка создать каталог
path.- mkdir_p!(path)
То же самое, что и
mkdir_p/1, но генерирует исключениеFile.Errorв случае неудачи. В противном случае:ok.- open(path, modes_or_function \\ [])
Открывает указанный
path.- open(path, modes, function)
Аналогично
open/2, но принимает функцию в качестве последнего аргумента.- open!(path, modes_or_function \\ [])
Аналогично
open/2, но генерирует исключениеFile.Errorесли файл не может быть открыт. В противном случае возвращает устройство ввода/вывода.- open!(path, modes, function)
Аналогично
open/3, но генерирует исключениеFile.Errorесли файл не может быть открыт.- read(path)
Возвращает
{:ok, binary}, гдеbinary— это объект двоичных данных, содержащий содержимоеpath, или{:error, reason}в случае ошибки.
- read!(path)
Возвращает двоичные данные содержимого заданного файла, или вызывает исключение
File.Error, если произошла ошибка.- read_link(path)
Читает символическую ссылку по адресу
path.- read_link!(path)
То же, что и
read_link/1, но возвращает целевой объект напрямую, или вызывает исключениеFile.Error, если произошла ошибка.- regular?(path, opts \\ [])
Возвращает
true, если путь указывает на обычный файл.- rename(source, destination)
Переименовывает файл
sourceв файлdestination. Может использоваться для перемещения файлов (и каталогов) между директориями. При перемещении файла, необходимо полностью указать имя файлаdestination, недостаточно указать только директорию.- rename!(source, destination)
То же, что и
rename/2, но вызывает исключениеFile.RenameError, если произошла ошибка. В противном случае возвращает:ok.- rm(path)
Попытка удалить файл
path.- rm!(path)
То же, что и
rm/1, но вызывает исключениеFile.Errorв случае неудачи. В противном случае:ok.- rm_rf(path)
Рекурсивно удаляет файлы и каталоги по заданному
path. Символические ссылки не отслеживаются, а просто удаляются. Несуществующие файлы игнорируются (функция не завершится с ошибкой).- rm_rf!(path)
То же, что и
rm_rf/1, но вызывает исключениеFile.Errorв случае неудачи, в противном случае список удаленных файлов или каталогов.- rmdir(path)
Попытка удалить директорию по адресу
path.- rmdir!(path)
То же, что и
rmdir/1, но вызывает исключениеFile.Errorв случае неудачи. В противном случае:ok.- stat(path, opts \\ [])
Возвращает информацию о
path. Если существует, возвращает кортеж{:ok, info}, где info — структураFile.Stat. Возвращает{:error, reason}по тем же причинам, что иread/1, если произошла ошибка.- stat!(path, opts \\ [])
То же, что и
stat/2, но возвращаетFile.Statнапрямую, или вызывает исключениеFile.Error, если произошла ошибка.- stream!(path, modes \\ [], line_or_bytes \\ :line)
Возвращает
File.Streamдля заданногоpathс заданнымиmodes.- touch(path, time \\ System.os_time(:second))
Обновляет время изменения (mtime) и время доступа (atime) заданного файла.
- touch!(path, time \\ System.os_time(:second))
То же, что и
touch/2, но вызывает исключениеFile.Errorпри ошибке. В противном случае:ok.- write(path, content, modes \\ [])
Записывает
contentв файлpath.- write!(path, content, modes \\ [])
То же, что и
write/3, но вызывает исключениеFile.Errorв случае ошибки. В противном случае:ok.- write_stat(path, stat, opts \\ [])
Записывает заданную
File.Statобратно в файловую систему по заданному пути. Возвращает:okили{:error, reason}.- write_stat!(path, stat, opts \\ [])
То же, что и
write_stat/3, но вызывает исключениеFile.Errorв случае ошибки. В противном случае:ok.
Типы
encoding_mode()Source
@type encoding_mode() ::
:utf8
| {:encoding,
:latin1
| :unicode
| :utf8
| :utf16
| :utf32
| {:utf16, :big | :little}
| {:utf32, :big | :little}} erlang_time()Source
@type erlang_time() ::
{{year :: non_neg_integer(), month :: 1..12, day :: 1..31},
{hour :: 0..23, minute :: 0..59, second :: 0..59}} io_device()Source
@type io_device() :: :file.io_device()
mode()Source
@type mode() ::
:append
| :binary
| :charlist
| :compressed
| :delayed_write
| :exclusive
| :raw
| :read
| :read_ahead
| :sync
| :write
| {:read_ahead, pos_integer()}
| {:delayed_write, non_neg_integer(), non_neg_integer()}
| encoding_mode() on_conflict_callback()Source
@type on_conflict_callback() :: (Path.t(), Path.t() -> boolean())
posix()Source
@type posix() :: :file.posix()
posix_time()Source
@type posix_time() :: integer()
stat_options()Source
@type stat_options() :: [{:time, :local | :universal | :posix}] stream_mode()Source
@type stream_mode() ::
encoding_mode()
| :append
| :compressed
| :delayed_write
| :trim_bom
| {:read_ahead, pos_integer() | false}
| {:delayed_write, non_neg_integer(), non_neg_integer()} Функции
cd(path)Source
@spec cd(Path.t()) :: :ok | {:error, posix()} Устанавливает текущую рабочую директорию.
Текущая рабочая директория устанавливается для BEAM глобально. Это может привести к гонкам, если несколько процессов одновременно изменяют текущую рабочую директорию. Чтобы запустить внешнюю команду в заданной директории без изменения глобальной текущей рабочей директории, используйте опцию :cd функции System.cmd/3 и Port.open/2.
Возвращает :ok в случае успеха, {:error, reason} в противном случае.
cd!(path)Source
@spec cd!(Path.t()) :: :ok
То же самое, что и cd/1, но генерирует исключение File.Error, если произошла ошибка.
cd!(path, function)Source
@spec cd!(Path.t(), (() -> res)) :: res when res: var
Изменяет текущую директорию на заданную path, выполняет заданную функцию и затем возвращает к предыдущему пути независимо от того, произошло ли исключение.
Текущая рабочая директория временно устанавливается для BEAM глобально. Это может привести к гонкам, если несколько процессов одновременно изменяют текущую рабочую директорию. Чтобы запустить внешнюю команду в заданной директории без изменения глобальной текущей рабочей директории, используйте опцию :cd функции System.cmd/3 и Port.open/2.
Генерирует ошибку, если получение или изменение текущей директории завершилось ошибкой.
chgrp(path, gid)Source
@spec chgrp(Path.t(), non_neg_integer()) :: :ok | {:error, posix()} Изменяет группу, заданную идентификатором группы gid для заданного file. Возвращает :ok в случае успеха или {:error, reason} в случае ошибки.
chgrp!(path, gid)Source
@spec chgrp!(Path.t(), non_neg_integer()) :: :ok
То же самое, что и chgrp/2, но генерирует исключение File.Error в случае ошибки. В противном случае :ok.
chmod(path, mode)Source
@spec chmod(Path.t(), non_neg_integer()) :: :ok | {:error, posix()} Изменяет mode для заданного file.
Возвращает :ok в случае успеха или {:error, reason} в случае ошибки.
Разрешения
Разрешения файлов задаются суммой следующих восьмеричных режимов:
0o400- разрешение на чтение: владелец0o200- разрешение на запись: владелец0o100- разрешение на выполнение: владелец0o040- разрешение на чтение: группа0o020- разрешение на запись: группа0o010- разрешение на выполнение: группа0o004- разрешение на чтение: другие0o002- разрешение на запись: другие0o001- разрешение на выполнение: другие
Например, установка режима 0o755 предоставляет разрешение на запись, чтение и выполнение владельцу, а также чтение и выполнение группе и другим.
chmod!(path, mode)Source
@spec chmod!(Path.t(), non_neg_integer()) :: :ok
То же самое, что и chmod/2, но генерирует исключение File.Error в случае ошибки. В противном случае :ok.
chown(path, uid)Source
@spec chown(Path.t(), non_neg_integer()) :: :ok | {:error, posix()} Изменяет владельца, заданного идентификатором пользователя uid для заданного file. Возвращает :ok в случае успеха или {:error, reason} в случае ошибки.
chown!(path, uid)Source
@spec chown!(Path.t(), non_neg_integer()) :: :ok
То же самое, что и chown/2, но генерирует исключение File.Error в случае ошибки. В противном случае :ok.
close(io_device)Source
@spec close(io_device()) :: :ok | {:error, posix() | :badarg | :terminated} Закрывает файл, на который ссылается io_device. В основном возвращает :ok, за исключением некоторых серьезных ошибок, таких как недостаток памяти.
Обратите внимание, что если при открытии файла была использована опция :delayed_write, close/1 может вернуть старую ошибку записи и даже не пытаться закрыть файл. См. open/2 для получения дополнительной информации.
copy(source, destination, bytes_count \\ :infinity)Source
@spec copy(Path.t() | io_device(), Path.t() | io_device(), pos_integer() | :infinity) ::
{:ok, non_neg_integer()} | {:error, posix()} Копирует содержимое source в destination.
Оба параметра могут быть именем файла или устройством ввода-вывода, открытым с помощью open/2. bytes_count определяет количество байтов для копирования, по умолчанию оно равно :infinity.
Если файл destination уже существует, он перезаписывается содержимым из source.
Возвращает {:ok, bytes_copied} в случае успеха, {:error, reason} в противном случае.
По сравнению с cp/3, эта функция более низкого уровня, позволяя копировать данные из устройства на устройство, ограниченное числом байтов. С другой стороны, cp/3 выполняет более тщательные проверки источника и назначения, а также сохраняет режим файла после копирования.
Типичные причины ошибок такие же, как и в open/2, read/1 и write/3.
copy!(source, destination, bytes_count \\ :infinity)Source
@spec copy!(Path.t() | io_device(), Path.t() | io_device(), pos_integer() | :infinity) :: non_neg_integer()
То же самое, что и copy/3, но генерирует исключение File.CopyError в случае ошибки. Возвращает bytes_copied в противном случае.
cp(source_file, destination_file, options \\ [])Source
@spec cp(Path.t(), Path.t(), [{:on_conflict, on_conflict_callback()}]) ::
:ok | {:error, posix()} Копирует содержимое source_file в destination_file, сохраняя его режимы.
source_file должен быть файлом или символической ссылкой на файл. destination_file должен быть путем к несуществующему файлу. Если один из параметров — это директория, будет возвращено {:error, :eisdir}.
Функция возвращает :ok в случае успеха. В противном случае возвращает {:error, reason}.
Если необходимо скопировать содержимое из устройства ввода-вывода на другое устройство или просто скопировать данные из источника в назначение без сохранения режимов, используйте copy/3.
Примечание: команда cp в системах Unix-подобных ведет себя по-разному в зависимости от того, является ли назначение существующей директорией или нет. Мы выбрали явно запретить копирование в директорию, и будет возвращена ошибка, если это будет попытка.
Опции
-
:on_conflict- (с версии v1.14.0) Вызывается, когда файл уже существует в пункте назначения. Функция получает аргументы дляsource_fileиdestination_file. Она должна возвращатьtrueесли существующий файл должен быть перезаписан,falseв противном случае. По умолчанию обратная функция возвращаетtrue. В более ранних версиях эта обратная функция могла быть предоставлена в качестве третьего аргумента, но такое поведение теперь устарело.
cp!(source_file, destination_file, options \\ [])Source
@spec cp!(Path.t(), Path.t(), [{:on_conflict, on_conflict_callback()}]) :: :ok То же самое, что и cp/3, но генерирует исключение File.CopyError в случае ошибки. Возвращает :ok в противном случае.
cp_r(source, destination, options \\ [])Source
@spec cp_r(Path.t(), Path.t(),
on_conflict: on_conflict_callback(),
dereference_symlinks: boolean()
) ::
{:ok, [binary()]} | {:error, posix(), binary()} Копирует содержимое source в destination рекурсивно, сохраняя структуру каталога и права исходного каталога.
Если source — это файл или символическая ссылка на него, то destination должно быть путем к существующему файлу, символической ссылке на него или пути к несуществующему файлу.
Если source — это каталог или символическая ссылка на него, то destination должно быть существующим directory или символической ссылкой на него, или путем к несуществующему каталогу.
Если исходный объект — файл, то копируется source в destination. Если исходный объект — каталог, то содержимое каталога копируется во внутренний каталог destination.
Если файл уже существует в месте назначения, вызывается необязательный обратный вызов on_conflict, заданный как опция. Подробнее см. в разделе «Опции».
Функция может завершиться ошибкой во время копирования файлов. В таких случаях каталог назначения останется в некорректном состоянии, и уже скопированные файлы не будут удалены.
Функция возвращает {:ok, files_and_directories} в случае успеха, где список files_and_directories содержит все скопированные файлы и каталоги в произвольном порядке. В противном случае возвращается {:error, reason, file}.
Примечание: Команда cp в системах Unix-подобных по-разному ведёт себя в зависимости от того, является ли destination существующим каталогом или нет. Мы выбрали явное запрещение этого поведения. Если source является file и destination — каталогом, то будет возвращено {:error, :eisdir}.
Опции
:on_conflict- (с версии v1.14.0) Вызывается, когда файл уже существует в месте назначения. Функция получает аргументы дляsourceиdestination. Она должна возвращатьtrueесли существующий файл должен быть перезаписан иfalseв противном случае. По умолчанию обратный вызов возвращаетtrue. В более ранних версиях этот обратный вызов можно было указать в качестве третьего аргумента, но такое поведение устарело.:dereference_symlinks- (с версии v1.14.0) По умолчанию эта функция копирует символические ссылки, создавая символические ссылки, которые указывают на то же местоположение. Этот параметр заставляет символические ссылки разрешаться и вместо этого копировать их содержимое, когда он установлен вtrue. Если разрешённые файлы не существуют, то операция завершается ошибкой. Значение по умолчаниюfalse.
Примеры
# Copies file "a.txt" to "b.txt"
File.cp_r("a.txt", "b.txt")
# Copies all files in "samples" to "tmp"
File.cp_r("samples", "tmp")
# Same as before, but asks the user how to proceed in case of conflicts
File.cp_r("samples", "tmp", on_conflict: fn source, destination ->
IO.gets("Overwriting #{destination} by #{source}. Type y to confirm. ") == "y\n"
end) cp_r!(source, destination, options \\ [])Source
@spec cp_r!(Path.t(), Path.t(), on_conflict: on_conflict_callback(), dereference_symlinks: boolean() ) :: [binary()]
То же, что и cp_r/3, но генерирует исключение File.CopyError, если произошла ошибка. В противном случае возвращает список скопированных файлов.
cwd()Source
@spec cwd() :: {:ok, binary()} | {:error, posix()} Возвращает текущий рабочий каталог.
В редких случаях эта функция может завершиться ошибкой в системах Unix-подобных системах. Это может произойти, если права на чтение не существуют для родительских каталогов текущего каталога. По этой причине в случае успеха возвращает {:ok, cwd}, а в противном случае {:error, reason}.
cwd!()Source
@spec cwd!() :: binary()
То же, что и cwd/0, но генерирует исключение File.Error, если произошла ошибка.
dir?(path, opts \\ [])Source
@spec dir?(Path.t(), [dir_option]) :: boolean() when dir_option: :raw
Возвращает true если заданный путь — это каталог.
Функция учитывает символические ссылки; если символическая ссылка указывает на каталог, возвращается true.
Опции
Поддерживаемые опции:
-
:raw- единственный атом, чтобы обойти файловый сервер и проверить файл только локально
Примеры
File.dir?("./test")
#=> true
File.dir?("test")
#=> true
File.dir?("/usr/bin")
#=> true
File.dir?("~/Downloads")
#=> false
"~/Downloads" |> Path.expand() |> File.dir?()
#=> true exists?(path, opts \\ [])Source
@spec exists?(Path.t(), [exists_option]) :: boolean() when exists_option: :raw
Возвращает true если заданный путь существует.
Это может быть обычный файл, каталог, сокет, символическая ссылка, именованная труба или файловый дескриптор. Возвращает false для символических ссылок, указывающих на несуществующий объект.
Опции
Поддерживаемые опции:
-
:raw- единственный атом, чтобы обойти файловый сервер и проверить файл только локально
Примеры
File.exists?("test/")
#=> true
File.exists?("missing.txt")
#=> false
File.exists?("/dev/null")
#=> true ln(existing, new)Source
@spec ln(Path.t(), Path.t()) :: :ok | {:error, posix()} Создаёт жёсткую ссылку new на файл existing.
Возвращает :ok при успехе, {:error, reason} в противном случае. Если операционная система не поддерживает жёсткие ссылки, возвращает {:error, :enotsup}.
ln!(existing, new)Source
@spec ln!(Path.t(), Path.t()) :: :ok
Аналогично ln/2, но генерирует исключение File.LinkError при неудачном выполнении. Возвращает :ok в противном случае.
ln_s(existing, new)Source
@spec ln_s(Path.t(), Path.t()) :: :ok | {:error, posix()} Создаёт символическую ссылку new на файл или каталог existing.
Возвращает :ok при успехе, {:error, reason} в противном случае. Если операционная система не поддерживает символические ссылки, возвращает {:error, :enotsup}.
ln_s!(existing, new)Source
@spec ln_s!(Path.t(), Path.t()) :: :ok
Аналогично ln_s/2, но генерирует исключение File.LinkError при неудачном выполнении. Возвращает :ok в противном случае.
ls(path \\ ".")Source
@spec ls(Path.t()) :: {:ok, [binary()]} | {:error, posix()} Возвращает список файлов в указанном каталоге.
Возвращает {:ok, files} при успехе, {:error, reason} в противном случае.
ls!(path \\ ".")Source
@spec ls!(Path.t()) :: [binary()]
То же, что и ls/1, но генерирует исключение File.Error в случае ошибки.
lstat(path, opts \\ [])Source
@spec lstat(Path.t(), stat_options()) :: {:ok, File.Stat.t()} | {:error, posix()} Возвращает информацию об path. Если файл — символическая ссылка, устанавливает type в :symlink и возвращает структуру File.Stat для ссылки. Для любого другого файла возвращаются те же значения, что и в stat/2.
Для получения дополнительной информации, см. :file.read_link_info/2.
Опции
Принимаемые опции:
-
:time- настраивает способ возвращения временных меток файла
Значения для :time могут быть:
-
:universal- возвращает кортеж{date, time}в формате UTC (по умолчанию) -
:local- возвращает кортеж{date, time}, используя время машины -
:posix- возвращает время в виде целого числа секунд с начала эпохи
Примечание: Поскольку временные метки файлов хранятся в формате POSIX на большинстве операционных систем, для получения информации о файлах быстрее использовать опцию time: :posix.
lstat!(path, opts \\ [])Source
@spec lstat!(Path.t(), stat_options()) :: File.Stat.t()
То же, что и lstat/2, но возвращает структуру File.Stat напрямую или генерирует исключение File.Error при возникновении ошибки.
mkdir(path)Source
@spec mkdir(Path.t()) :: :ok | {:error, posix()} Пытается создать директорию path.
Пропущенные родительские директории не создаются. Возвращает :ok при успехе или {:error, reason} при возникновении ошибки.
Типичные причины ошибок:
-
:eacces- отсутствуют права доступа для поиска или записи в родительские директорииpath -
:eexist- уже существует файл или директория с именемpath -
:enoent- компонентpathне существует -
:enospc- на устройстве закончилось место -
:enotdir- компонентpathне является директорией; на некоторых платформах, вместо этого, возвращается:enoent
mkdir!(path)Source
@spec mkdir!(Path.t()) :: :ok
То же, что и mkdir/1, но при неудаче генерирует исключение File.Error. В противном случае :ok.
mkdir_p(path)Source
@spec mkdir_p(Path.t()) :: :ok | {:error, posix()} Пытается создать директорию path.
Пропущенные родительские директории создаются. Возвращает :ok при успехе или {:error, reason} при возникновении ошибки.
Типичные причины ошибок:
-
:eacces- отсутствуют права доступа для поиска или записи в родительские директорииpath -
:enospc- на устройстве закончилось место -
:enotdir- компонентpathне является директорией
mkdir_p!(path)Source
@spec mkdir_p!(Path.t()) :: :ok
То же, что и mkdir_p/1, но при неудаче генерирует исключение File.Error. В противном случае :ok.
open(path, modes_or_function \\ [])Source
@spec open(Path.t(), [mode() | :ram]) :: {:ok, io_device()} | {:error, posix()} @spec open(Path.t(), (io_device() -> res)) :: {:ok, res} | {:error, posix()}
when res: var Открывает указанный path.
Для чтения и записи файлов необходимо использовать функции из модуля IO. По умолчанию файл открывается в режиме :binary, для взаимодействия с ним требуются функции IO.binread/2 и IO.binwrite/2. Разработчик может передать :utf8 при открытии файла, и тогда все остальные функции из IO будут доступны, так как они работают непосредственно с данными Unicode.
modes_or_function может быть списком режимов или функцией. Если это список, он рассматривается как список режимов (документированных ниже). Если это функция, она эквивалентна вызову open(path, [], modes_or_function). Подробнее об этой функции см. документацию для open/3.
Доступные режимы:
:binary- открывает файл в двоичном режиме, отключая специальную обработку последовательностей Unicode (режим по умолчанию).:read- файл, который обязательно должен существовать, открывается для чтения.-
:write- файл открывается для записи. Он создаётся, если не существует.Если файл существует, и запись не сочетается с чтением, файл будет обнулён.
:append- файл будет открыт для записи и создан, если не существует. Если файл существует, функция `open` вернёт{:error, :eexist}.:exclusive- при передаче этого значения операции чтения файла будут возвращать списки символов, а не бинарные данные.-
:compressed- позволяет читать или писать сжатые файлы gzip.Параметр `compressed` должен быть объединён либо с чтением, либо с записью, но не с обоими одновременно. Обратите внимание, что размер файла, полученный с помощью
stat/1, скорее всего, не будет совпадать с количеством байтов, которые можно прочитать из сжатого файла. -
:utf8- этот параметр определяет, как данные фактически хранятся в файле на диске и обеспечивает автоматическое преобразование символов в UTF-8 и обратно.Если данные отправляются в файл в формате, который не может быть преобразован в UTF-8, или если данные читаются функцией, которая возвращает данные в формате, не поддерживающем диапазон символов, произойдёт ошибка, и файл будет закрыт.
:delayed_write,:raw,:ram,:read_ahead,:sync,{:encoding, ...},{:read_ahead, pos_integer},{:delayed_write, non_neg_integer, non_neg_integer}- для получения дополнительной информации об этих параметрах см.:file.open/2.
Эта функция возвращает:
-
{:ok, io_device}- файл был открыт в запрошенном режиме.io_deviceфактически является PID процесса, который обрабатывает файл. Этот процесс контролирует процесс, который изначально открыл файл (процесс-владелец). Если процесс-владелец завершается, файл закрывается, и сам процесс также завершается. Если завершается любой процесс, к которому связанio_device, файл будет закрыт, и сам процесс будет завершён.io_deviceрезультат данного вызова может использоваться в качестве аргумента для функций модуляIO. {:error, reason}- файл не удалось открыть.
Примеры
{:ok, file} = File.open("foo.tar.gz", [:read, :compressed])
IO.read(file, :line)
File.close(file) open(path, modes, function)Source
@spec open(Path.t(), [mode() | :ram], (io_device() -> res)) ::
{:ok, res} | {:error, posix()}
when res: var Аналогично open/2, но в качестве последнего аргумента ожидает функцию.
Файл открывается, передаётся функции в качестве аргумента и автоматически закрывается после возвращения функции, независимо от того, была ли ошибка при выполнении функции.
Возвращает {:ok, function_result} в случае успеха, {:error, reason} в противном случае.
Эта функция ожидает успешного закрытия файла, что обычно имеет место, если не задан параметр :delayed_write. По этой причине мы не рекомендуем передавать :delayed_write в эту функцию.
Примеры
File.open("file.txt", [:read, :write], fn file ->
IO.read(file, :line)
end)
См. open/2 для списка доступных modes.
open!(path, modes_or_function \\ [])Source
@spec open!(Path.t(), [mode() | :ram]) :: io_device()
@spec open!(Path.t(), (io_device() -> res)) :: res when res: var
Аналогично open/2, но генерирует исключение File.Error, если файл не удалось открыть. В противном случае возвращает устройство ввода-вывода.
См. open/2 для списка доступных режимов.
open!(path, modes, function)Source
@spec open!(Path.t(), [mode() | :ram], (io_device() -> res)) :: res when res: var
Аналогично open/3, но генерирует исключение File.Error, если файл не удалось открыть.
В случае успеха возвращает результат function на устройстве ввода-вывода.
См. open/2 для списка доступных modes.
read(path)Source
@spec read(Path.t()) :: {:ok, binary()} | {:error, posix()} Возвращает {:ok, binary}, где binary — это бинарный объект данных, содержащий содержимое path, или {:error, reason} при возникновении ошибки.
Типичные причины ошибок:
-
:enoent- файл не существует -
:eacces- отсутствует разрешение на чтение файла или поиск в одной из родительских директорий -
:eisdir- указанное имя файла является директорией -
:enotdir- компонент имени файла не является директорией; на некоторых платформах, вместо этого, возвращается:enoent -
:enomem- недостаточно памяти для содержимого файла
Вы можете использовать :file.format_error/1 для получения описательной строки ошибки.
read!(path)Source
@spec read!(Path.t()) :: binary()
Возвращает бинарный объект с содержимым указанного файла или генерирует исключение File.Error, если произошла ошибка.
read_link(path)Source
@spec read_link(Path.t()) :: {:ok, binary()} | {:error, posix()} Считывает символическую ссылку по адресу path.
Если path существует и является символической ссылкой, возвращает {:ok, target}, в противном случае возвращает {:error, reason}.
Для получения более подробной информации, см. :file.read_link/1.
Типичные причины ошибок:
-
:einval- путь не является символической ссылкой -
:enoent- путь не существует -
:enotsup- символические ссылки не поддерживаются на текущей платформе
read_link!(path)Source
@spec read_link!(Path.t()) :: binary()
Аналогично read_link/1, но возвращает целевой путь напрямую или вызывает исключение File.Error, если произошла ошибка.
regular?(path, opts \\ [])Source
@spec regular?(Path.t(), [regular_option]) :: boolean() when regular_option: :raw
Возвращает true, если путь указывает на обычный файл.
Эта функция следует за символическими ссылками, поэтому если символическая ссылка указывает на обычный файл, возвращается true.
Параметры
Поддерживаемые параметры:
-
:raw- атом для пропуска сервера файлов и проверки файла локально
Примеры
File.regular?(__ENV__.file) #=> true
rename(source, destination)Source
@spec rename(Path.t(), Path.t()) :: :ok | {:error, posix()} Переименовывает файл source в файл destination. Может использоваться для перемещения файлов (и каталогов) между директориями. При перемещении файла необходимо указать полный путь к целевому файлу; указание только каталога недостаточно.
Возвращает :ok в случае успеха, {:error, reason} в противном случае.
Примечание: команда mv в системах Unix-подобного типа ведет себя по-разному в зависимости от того, является ли source файлом и является ли destination существующим каталогом. Мы выбрали явное запрещение такого поведения.
Примеры
# Rename file "a.txt" to "b.txt"
File.rename("a.txt", "b.txt")
# Rename directory "samples" to "tmp"
File.rename("samples", "tmp") rename!(source, destination)Source
@spec rename!(Path.t(), Path.t()) :: :ok
Аналогично rename/2, но генерирует исключение File.RenameError, если операция завершается неудачно. В противном случае возвращает :ok.
rm(path)Source
@spec rm(Path.t()) :: :ok | {:error, posix()} Пытается удалить файл path.
Возвращает :ok при успехе или {:error, reason} при возникновении ошибки.
Обратите внимание, что файл удаляется даже если он в режиме только для чтения.
Типичные причины ошибок:
-
:enoent- файла не существует -
:eacces- недостаточно прав для файла или одного из его родительских каталогов -
:eperm- файл является каталогом, и пользователь не является суперпользователем -
:enotdir- компонент имени файла не является каталогом; на некоторых платформах:enoentвозвращается вместо этого -
:einval- имя файла имело неверный тип, например, кортеж
Примеры
File.rm("file.txt")
#=> :ok
File.rm("tmp_dir/")
#=> {:error, :eperm} rm!(path)Source
@spec rm!(Path.t()) :: :ok
Аналогично rm/1, но вызывает исключение File.Error в случае неудачи. В противном случае :ok.
rm_rf(path)Source
@spec rm_rf(Path.t()) :: {:ok, [binary()]} | {:error, posix(), binary()} Рекурсивно удаляет файлы и каталоги по указанному path. Символические ссылки не отслеживаются, а просто удаляются; несуществующие файлы просто игнорируются (т.е. не приводят к сбою этой функции).
Возвращает {:ok, files_and_directories} со всеми удаленными файлами и каталогами в произвольном порядке; {:error, reason, file} в противном случае.
Примеры
File.rm_rf("samples")
#=> {:ok, ["samples", "samples/1.txt"]}
File.rm_rf("unknown")
#=> {:ok, []} rm_rf!(path)Source
@spec rm_rf!(Path.t()) :: [binary()]
Аналогично rm_rf/1, но генерирует исключение File.Error в случае неудачи. В противном случае возвращает список удалённых файлов или каталогов.
rmdir(path)Source
@spec rmdir(Path.t()) :: :ok | {:error, posix()} Пытается удалить каталог по адресу path.
Возвращает :ok при успехе, или {:error, reason} при ошибке. Возвращает {:error, :eexist} если каталог не пуст.
Примеры
File.rmdir("tmp_dir")
#=> :ok
File.rmdir("non_empty_dir")
#=> {:error, :eexist}
File.rmdir("file.txt")
#=> {:error, :enotdir} rmdir!(path)Source
@spec rmdir!(Path.t()) :: :ok | {:error, posix()} Аналогично rmdir/1, но генерирует исключение File.Error при ошибке. В противном случае :ok.
stat(path, opts \\ [])Source
@spec stat(Path.t(), stat_options()) :: {:ok, File.Stat.t()} | {:error, posix()} Возвращает информацию об path. Если он существует, возвращает кортеж {:ok, info}, где info — структура File.Stat. Возвращает {:error, reason} по тем же причинам, что и read/1, если произошла ошибка.
Параметры
Принимаемые параметры:
-
:time- настраивает способ возврата временных меток файлов
Значения для :time могут быть:
-
:universal- возвращает кортеж{date, time}в формате UTC (по умолчанию) -
:local- возвращает кортеж{date, time}с использованием часового пояса машины -
:posix- возвращает время в виде целого числа секунд с эпохи
Примечание: поскольку временные метки файлов хранятся в формате POSIX time на большинстве операционных систем, получение информации о файле с параметром time: :posix быстрее.
stat!(path, opts \\ [])Source
@spec stat!(Path.t(), stat_options()) :: File.Stat.t()
Аналогично stat/2, но возвращает структуру File.Stat напрямую, или вызывает исключение File.Error, если произошла ошибка.
stream!(path, modes \\ [], line_or_bytes \\ :line)Source
@spec stream!(Path.t(), [stream_mode()], :line | pos_integer()) :: File.Stream.t()
Возвращает File.Stream для заданного path с заданными modes.
Поток реализует протоколы Enumerable и Collectable, что означает, что он может использоваться как для чтения, так и для записи.
Аргумент line_or_bytes настраивает способ чтения файла при потоковой передаче, по :line (по умолчанию) или по заданному числу байтов. При использовании опции :line, символы новой строки CRLF ("\r\n") нормализуются до LF ("\n").
Работа с потоком может завершиться ошибкой при открытии по тем же причинам, что и File.open!/2. Обратите внимание, что файл автоматически открывается каждый раз, когда начинается потоковая передача. Нет необходимости передавать :read и :write режимы, так как они автоматически устанавливаются Elixir.
Необработанные файлы
Поскольку Elixir управляет тем, когда открывается потоковый файл, базовая система не может быть общей, и поэтому для повышения производительности удобно открывать файл в необработанном режиме. Поэтому Elixir будет открывать потоки в режиме :raw с опцией :read_ahead за исключением случаев, когда указано кодирование. Это означает, что любые данные, передаваемые в файл потоком, должны быть преобразованы в тип iodata/0. Если вы передаете, например, [encoding: :utf8] или [encoding: {:utf16, :little}] в параметре modes, базовый поток будет использовать IO.write/2 и протокол String.Chars для преобразования данных. См. IO.binwrite/2 и IO.write/2.
Также можно рассмотреть возможность передачи опции :delayed_write, если предполагается запись в поток в узком цикле.
Маркеры порядка байтов
Если вы передаете :trim_bom в параметре modes, поток будет обрезать маркеры порядка байтов UTF-8, UTF-16 и UTF-32 при чтении из файла.
Обратите внимание, что эта функция не пытается определить кодировку файла на основе BOM.
Примеры
# Read in 2048 byte chunks rather than lines
File.stream!("./test/test.data", [], 2048)
#=> %File.Stream{line_or_bytes: 2048, modes: [:raw, :read_ahead, :binary],
#=> path: "./test/test.data", raw: true}
См. Stream.run/1 для примера потоковой передачи в файл.
touch(path, time \\ System.os_time(:second))Source
@spec touch(Path.t(), erlang_time() | posix_time()) :: :ok | {:error, posix()} Обновляет время изменения (mtime) и время доступа (atime) указанного файла.
Файл создается, если он не существует. Требуется дата и время в UTC (как возвращает :erlang.universaltime()) или целое число, представляющее метку времени POSIX (как возвращает System.os_time(:second)).
В системах Unix изменение времени изменения может потребовать, чтобы вы были либо root , либо владельцем файла. Иметь права на запись может быть недостаточно. В этих случаях касание файла в первый раз (для его создания) будет успешным, но касание существующего файла завершится ошибкой с {:error, :eperm}.
Примеры
File.touch("/tmp/a.txt", {{2018, 1, 30}, {13, 59, 59}})
#=> :ok
File.touch("/fakedir/b.txt", {{2018, 1, 30}, {13, 59, 59}})
{:error, :enoent}
File.touch("/tmp/a.txt", 1544519753)
#=> :ok touch!(path, time \\ System.os_time(:second))Source
@spec touch!(Path.t(), erlang_time() | posix_time()) :: :ok
То же, что и touch/2, но при неудаче генерирует исключение File.Error. В противном случае возвращает :ok.
Файл создается, если он не существует. Требуется дата и время в UTC (как возвращает :erlang.universaltime()) или целое число, представляющее метку времени POSIX (как возвращает System.os_time(:second)).
Примеры
File.touch!("/tmp/a.txt", {{2018, 1, 30}, {13, 59, 59}})
#=> :ok
File.touch!("/fakedir/b.txt", {{2018, 1, 30}, {13, 59, 59}})
** (File.Error) could not touch "/fakedir/b.txt": no such file or directory
File.touch!("/tmp/a.txt", 1544519753) write(path, content, modes \\ [])Source
@spec write(Path.t(), iodata(), [mode()]) :: :ok | {:error, posix()} Записывает content в файл path.
Файл создается, если он не существует. Если он существует, предыдущее содержимое перезаписывается. Возвращает :ok при успехе или {:error, reason} при ошибке.
content должно быть iodata (список байтов или двоичное значение). Установка кодировки для этой функции не оказывает влияния.
Предупреждение: Каждый раз, когда вызывается эта функция, открывается дескриптор файла и создается новый процесс для записи в файл. По этой причине, если вы выполняете несколько записей в цикле, открытие файла с помощью File.open/2 и использование функций в IO для записи в файл обеспечит гораздо лучшую производительность, чем вызов этой функции несколько раз.
Типичные причины ошибок:
-
:enoent- компонент имени файла не существует -
:enotdir- компонент имени файла не является каталогом; на некоторых платформах вместо этого возвращается:enoent -
:enospc- на устройстве закончилось место -
:eacces- нет разрешения на запись в файл или поиск одного из родительских каталогов -
:eisdir- указанное имя — это каталог
См. File.open/2 для других доступных параметров.
write!(path, content, modes \\ [])Source
@spec write!(Path.t(), iodata(), [mode()]) :: :ok
То же, что и write/3, но при неудаче генерирует исключение File.Error. В противном случае возвращает :ok.
write_stat(path, stat, opts \\ [])Source
@spec write_stat(Path.t(), File.Stat.t(), stat_options()) :: :ok | {:error, posix()} Записывает заданный File.Stat обратно в файловую систему по заданному пути. Возвращает :ok или {:error, reason}.
write_stat!(path, stat, opts \\ [])Source
@spec write_stat!(Path.t(), File.Stat.t(), stat_options()) :: :ok
То же, что и write_stat/3, но при неудаче генерирует исключение File.Error. В противном случае возвращает :ok.
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.14.1/File.html