当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Elixir File.open用法及代码示例


Elixir语言中 File.open 相关用法介绍如下。

用法一

open(path, modes_or_function \\ [])
@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 - 将打开文件进行写入,如果文件不存在则创建。对使用 append 打开的文件的每个写入操作都将在文件末尾进行。

  • :exclusive - 文件在打开写入时,如果不存在则创建。如果文件存在,open 将返回 {:error, :eexist}

  • :charlist - 当给出这个术语时,对文件的读取操作将返回字符列表而不是二进制文件。

  • :compressed - 可以读取或写入 gzip 压缩文件。

    压缩选项必须与读或写结合,但不能同时结合。请注意,使用 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)
@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)

有关可用的 modes 列表,请参阅 open/2

相关用法


注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 File.open(path, modes_or_function \\ [])。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。