當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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 \\ [])。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。