Go 語言基礎系列(十一):文件操作
今天我們來學習一個新的簡單的操作:文件操作。我們知道在計算機中存儲了大量的文件,而我們在日常開發中經常需要操作計算機或者服務器裏的文件,所以今天我們來學習一些文件操作相關的內容,幫助大家有一個基本的認識。
由於在計算機中文件非常多,爲了便於管理,所以出現了目錄,因此,我們在介紹文件操作時,必定會涉及到目錄的操作;除此之外,對於一些特殊的文件格式的內容處理,我們也做一定程度的介紹,比如 json 文件
思維邏輯圖如下:
下面我們從以上三個方面對 **文件操作 **進行相應的介紹
** 目錄操作 **
對於目錄操作,一般來說,我們肯定想知道目錄下面有什麼文件?怎麼改一下目錄名字
?還希望創建一個新的目錄,或者刪除目錄
查
Golang 中,我們以我 windows 系統電腦上 D:\Software\516test 目錄爲例,來進行查詢操作
該目錄下的內容如下:
示例:
結果如下:
分析:我們通過 Golang 標準庫裏的 ioutil 包下的 ReadDir 函數進行讀取操作。我們可以適當看一下 ReadDir 源碼
由上圖可知,在源碼中 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