Elixir File模塊

2023-12-15 14:11 更新

File模塊中的函數(shù)讓我們能夠像打開(kāi)IO設(shè)備一樣打開(kāi)文件.文件默認(rèn)以二進(jìn)制模式打開(kāi),需要使用IO模塊中的IO.binread/2IO.binwrite/2函數(shù)進(jìn)行讀寫(xiě):

iex> {:ok, file} = File.open "hello", [:write]
{:ok, #PID<0.47.0>}
iex> IO.binwrite file, "world"
:ok
iex> File.close file
:ok
iex> File.read "hello"
{:ok, "world"}

文件也可以以:utf8編碼打開(kāi),它會(huì)告訴File模塊將文件中讀到的字節(jié)理解為UTF-8編碼過(guò)的字節(jié).

除了打開(kāi)和讀寫(xiě)文件之外,File模塊還提供了許多文件操作函數(shù).這些函數(shù)命名和UNIX中的相對(duì)應(yīng).例如,File.rm/1克英語(yǔ)刪除文件,File.mkdir/1用于創(chuàng)建目錄,File.mkdir_p/1用于創(chuàng)建目錄和它所有的父目錄.甚至還有File.cp_r/2File.rm_rf/1,用于目錄遞歸地復(fù)制或刪除文件(復(fù)制或刪除目錄中的內(nèi)容).

你會(huì)發(fā)現(xiàn)File模塊中的函數(shù)有兩種形式:一種是"普通"形式,一種是帶有感嘆號(hào)(!)的形式.例如,例如,當(dāng)我們?cè)谏厦娴睦又凶x取"hello"文件時(shí),我們使用File.read/1.或者,我們可以使用File.read!/1:

iex> File.read "hello"
{:ok, "world"}
iex> File.read! "hello"
"world"
iex> File.read "unknown"
{:error, :enoent}
iex> File.read! "unknown"
** (File.Error) could not read file unknown: no such file or directory

注意到當(dāng)文件不存在時(shí),帶!的版本拋出了一個(gè)錯(cuò)誤.當(dāng)你想要用模式匹配來(lái)處理不同的輸入時(shí)最好使用不帶!的版本:

case File.read(file) do
  {:ok, body}      -> # do something with the `body`
  {:error, reason} -> # handle the error caused by `reason`
end

然而,如果你期望文件在那兒,帶感嘆號(hào)的版本就更有用,因?yàn)樗鼤?huì)拋出一個(gè)有意義的錯(cuò)誤信息.不要這樣寫(xiě):

{:ok, body} = File.read(file)

當(dāng)發(fā)生錯(cuò)誤時(shí),File.read/1會(huì)返回{:error, reason},模式匹配就會(huì)失敗.你仍然會(huì)得到想要的結(jié)果(拋出錯(cuò)誤),但信息會(huì)是模式不匹配(因此就不知道錯(cuò)誤到底是什么了).

所以,如果你不想掌控錯(cuò)誤,最好使用使用File.read!/1.

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)