Go 語言基礎系列(十一):文件操作

今天我們來學習一個新的簡單的操作:文件操作。我們知道在計算機中存儲了大量的文件,而我們在日常開發中經常需要操作計算機或者服務器裏的文件,所以今天我們來學習一些文件操作相關的內容,幫助大家有一個基本的認識。

由於在計算機中文件非常多,爲了便於管理,所以出現了目錄,因此,我們在介紹文件操作時,必定會涉及到目錄的操作;除此之外,對於一些特殊的文件格式的內容處理,我們也做一定程度的介紹,比如 json 文件

思維邏輯圖如下:

下面我們從以上三個方面對 **文件操作 **進行相應的介紹

**   目錄操作  **

對於目錄操作,一般來說,我們肯定想知道目錄下面有什麼文件?怎麼改一下目錄名字

?還希望創建一個新的目錄,或者刪除目錄

Golang 中,我們以我 windows 系統電腦上 D:\Software\516test 目錄爲例,來進行查詢操作

該目錄下的內容如下:

示例:

結果如下:

分析:我們通過 Golang 標準庫裏的 ioutil 包下的 ReadDir 函數進行讀取操作。我們可以適當看一下 ReadDir 源碼

可以看出,ReadDir 通過調用操作系統標準庫 os 包的 open 函數打開指定的目錄,然後對查詢的內容通過一定的順序顯示出來。ReadDir 的返回值爲:FileInfo,我們可以看一下 FileInfo 是如何定義的

由上圖可知,在源碼中 FileInfo 是一個接口,該接口描述了文件的一些信息:比如名字,大小,模式,修改時間,是否是文件夾,數據源信息等相關內容

此時,再回過頭來看我們的程序打印結果,發現我們並不能像在 windows 界面打開的目錄一樣顯示是文件夾還是文件,那麼怎麼做呢?相信大家已經知道怎麼做了,正如我們打印名字一樣,可以通過接口提供的方法進行判斷。如下:

結果如下:

下面我們通過示例介紹如何修改文件夾的目錄,我們將上面的 plugins 目錄名修改爲 516test

再次遍歷,結果如下:

增是指我們新創建目錄,我們在 D:\Software\516test 下分別創建一級目錄 test 和多級目錄 test00\516\16,示例如下:

結果如下:

分析:上例中 0777 是什麼意思呢?在 linux 文件中,文件是有權限的,分爲:讀,寫和執行,字母表示爲:r,w,x,而它們用數字表示分別爲:4,2,1;同時,文件的權限又是相對於文件的所屬者、所屬組以及其他組的來講的。所以 0777 代表該文件對於所屬者、所屬組以及其他組的權限均爲:可讀可寫可執行。其中 0 代表八進制

結果如下:

分析:Remove 函數只能刪除空目錄,否則會報”The directory is not empty “錯誤,要想刪除有子目錄或者有其他內容的目錄需要使用 RemoveAll 函數

**   文件操作  **

對於文件的操作,我們平常使用最多的是讀取文件中的內容和寫內容到文件,偶爾會刪除或者創建文件,所以我們先介紹一下文件的創建和刪除,再介紹讀寫文件

結果如下:

我們可以順便看一下 Create 的源碼

分析:由源碼可知,Create 函數創建文件時如果文件已存在並不會報錯,而是將文件清空。我們繼續看一下 OpenFile 函數

OpenFile 中的入參 flag 是新創建文件的訪問模式,在標準庫庫中定義瞭如下的模式類別

OpenFile 中的入參 perm 是新創建文件的模式和權限,在標準庫庫中定義瞭如下的模式類別

分析:就像標準庫註釋掉的內容所說明的,我們主要使用它的 9bit 表示所屬者、所屬組以及其他組。這裏 OpenFile 用的是默認 0666

文件的刪除和文件夾的刪除一樣,如若我們需要刪除單個文件直接調用 Remove 函數,如果需要刪除該目錄下的所有文件,則使用 RemoveAll 函數

讀取文件中的內容,我們自然會想到從文件開頭讀,或者從文件某個地方開始讀。這兩種方式均通過接口來實現,分別對定於標準庫的 Reader 和 ReaderAt 接口,Read 和 ReadAt 函數代表讀取最多 len(p) 長度的數據到 p 數組中,返回實際讀取的字節數,以及可能的錯誤

示例如下:我們在 test.txt 文件中添加如下內容:

Reader 接口示例如下:

結果如下:

ReaderAt 接口示例如下:

結果如下:

分析:ReaderAt 示例中我們將 byte 數組的長度改爲 100(小於 176),是因爲 ReaderAt 接口當讀取數據的實際長度小於 byte 數組的長度時,會一直報錯。也就是說,ReaderAt 接口讀取的數據的長度必須等於 byte 數組的長度

和讀取文件的內容一個道理,有時候我們需要寫文件,要麼從頭寫文件,要麼從某個點開始寫。同樣的,寫文件也是通過接口完成的,分別是:Write 和 WriteAt。但是需注意這兩個接口寫文件均會將原文件覆蓋

Write 接口示例如下:

結果如下:

WriteAt 接口示例,我們仍然在這個新建的 test1 文件裏寫入內容,我們從第 13 個字節開始寫入

結果如下:

分析:可見 WriteAt 接口覆蓋了原有的內容

**   特殊文件 json 操作  **

關於 json 的詳細內容,大家可以通過官網或者類似的網站進行鍼對性的學習。我們這裏只需簡單的知道:json 是一種數據交換格式,由於其良好的特性在編程中得到了廣泛的應用。json 文件的操作主要涉及兩個方面:一個是將數據轉換爲 json 格式,可以稱之爲編碼的過程,另外一個是將 json 格式的數據轉換爲目標格式,可以稱之爲解碼的過程。

編碼

將數據編碼成 json 格式,使用 Marshal 函數,由標準庫 encoding/json 提供

Marshal 的輸入是一個接口類型,輸出爲轉換後的字節數組和可能遇到的錯誤。我們以結構體爲例

結果如下:

我們用工具將格式調整一下

分析:如上所示,我們就將一個結構體數據編碼爲 json 格式,在本例中定義 Student 結構體時後面新增的 json:" " 是對結構體的編碼進行控制,我們可以將結構體的字段轉換爲 json 裏的其他的名字或者不同的大小寫方式

解碼

將 json 格式的數據轉換爲目標格式,使用 encoding/json 包的 Unmarshal 函數

結果如下:

到此關於 Golang 文件操作相關內容的分享就結束了~

此篇爲 Go 語言基礎系列分享第十一篇,歡迎大家關注本公衆號**《Go 開發與計算機技術》**,Go 語言基礎系列學習不迷路。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/efztcn9pOjCnDm5V4jOVkQ