## 操作文件夾和文件
Go提供了os和 ioutils包來對文件和文件夾進行操作,值得高興的是,它們是跨平臺的,無需對操作系統做過多考慮。
### 實踐
1. 建立 dirs.go :
```
package filedirs
import (
"errors"
"io"
"os"
)
// 操縱文件和目錄
func Operate() error {
// 文件權限0755類似于你在命令行中使用的chown,
// 這將創建一個目錄 /tmp/example,
// 你也可以使用絕對路徑而不是相對路徑
if err := os.Mkdir("example_dir", os.FileMode(0755)); err != nil {
return err
}
// 跳轉到 /tmp 目錄
if err := os.Chdir("example_dir"); err != nil {
return err
}
// f是一個通用的文件對象 它還實現了多個接口,并且如果在打開時設置了正確的方式,則可以用作讀取器或寫入器
f, err := os.Create("test.txt")
if err != nil {
return err
}
// 向文件寫入長度已知的數據 并確認寫入成功
value := []byte("hello\n")
count, err := f.Write(value)
if err != nil {
return err
}
if count != len(value) {
return errors.New("incorrect length returned from write")
}
if err := f.Close(); err != nil {
return err
}
// 讀取文件
f, err = os.Open("test.txt")
if err != nil {
return err
}
io.Copy(os.Stdout, f)
if err := f.Close(); err != nil {
return err
}
// 跳轉到 /tmp 文件夾
if err := os.Chdir(".."); err != nil {
return err
}
// 刪除建立的文件夾
// os.RemoveAll如果傳遞了錯誤的文件夾路徑會返回錯誤
if err := os.RemoveAll("example_dir"); err != nil {
return err
}
return nil
}
```
2. 建立bytes.go:
```
package filedirs
import (
"bytes"
"io"
"os"
"strings"
)
// 讀取并轉換為大寫后復制內容到目標文件
func Capitalizer(f1 *os.File, f2 *os.File) error {
if _, err := f1.Seek(0, 0); err != nil {
return err
}
var tmp = new(bytes.Buffer)
if _, err := io.Copy(tmp, f1); err != nil {
return err
}
s := strings.ToUpper(tmp.String())
if _, err := io.Copy(f2, strings.NewReader(s)); err != nil {
return err
}
return nil
}
// 建立兩個文件 將其中一個的內容轉換為大寫復制給另一個
func CapitalizerExample() error {
f1, err := os.Create("file1.txt")
if err != nil {
return err
}
if _, err := f1.Write([]byte(` this file contains a number of words and new lines`)); err != nil {
return err
}
f2, err := os.Create("file2.txt")
if err != nil {
return err
}
if err := Capitalizer(f1, f2); err != nil {
return err
}
if err := os.Remove("file1.txt"); err != nil {
return err
}
if err := os.Remove("file2.txt"); err != nil {
return err
}
return nil
}
```
3. 建立main.go:
```
package main
import "github.com/agtorre/go-cookbook/chapter1/filedirs"
func main() {
if err := filedirs.Operate(); err != nil {
panic(err)
}
if err := filedirs.CapitalizerExample(); err != nil {
panic(err)
}
}
```
4. 運行main.go,這會輸出:
```
hello
```
示例在運行中會分別建立file1.txt和file2.txt然后刪掉,file1.txt中包含:
```
this file contains a number of words and new lines
```
file2.txt中包含:
```
THIS FILE CONTAINS A NUMBER OF WORDS AND NEW LINES
```
### 說明
如果你熟悉Unix下的文件系統,那么Go的os包一定看起來很親切。你可以使用該包進行基本的文件操作——例如查看文件狀態,修改文件權限,操作文件及文件夾等。在示例中我們對目錄和文件進行了操作,并在操作結束后對其進行刪除。
操作文件對象與操作內存中的流數據非常相似。os.File還提供了許多便利的函數,例如Chown,Stat和Truncate。 想要熟悉os.File的各種函數最簡單方法就是使用它們。在所有的示例中,我們都會小心的清理程序中額外產生的臨時文件,在日常工作中這也是個很好的習慣。
當你讀取文件并將其存儲在File結構之后,就可以輕松地將其傳遞給前面討論的多個 I/O 接口。在之前示例中,我們看到的對緩沖區和內存數據的操作都可以直接替換為文件對象。因此,對于諸如將日志寫入stderr以及對單個寫入調用同時將其寫入文件之類的操作會很有用。
* * * *
學識淺薄,錯誤在所難免。歡迎在群中就本書提出修改意見,以饗后來者,長風拜謝。
Golang中國(211938256)
beego實戰(258969317)
Go實踐(386056972)
- 前言
- 第一章 I/O和文件系統
- 常見 I/O 接口
- 使用bytes和strings包
- 操作文件夾和文件
- 使用CSV格式化數據
- 操作臨時文件
- 使用 text/template和HTML/templates包
- 第二章 命令行工具
- 解析命令行flag標識
- 解析命令行參數
- 讀取和設置環境變量
- 操作TOML,YAML和JSON配置文件
- 操做Unix系統下的pipe管道
- 處理信號量
- ANSI命令行著色
- 第三章 數據類型轉換和解析
- 數據類型和接口轉換
- 使用math包和math/big包處理數字類型
- 貨幣轉換和float64注意事項
- 使用指針和SQL Null類型進行編碼和解碼
- 對Go數據編碼和解碼
- Go中的結構體標簽和反射
- 通過閉包實現集合操作
- 第四章 錯誤處理
- 錯誤接口
- 使用第三方errors包
- 使用log包記錄錯誤
- 結構化日志記錄
- 使用context包進行日志記錄
- 使用包級全局變量
- 處理恐慌
- 第五章 數據存儲
- 使用database/sql包操作MySQL
- 執行數據庫事務接口
- SQL的連接池速率限制和超時
- 操作Redis
- 操作MongoDB
- 創建存儲接口以實現數據可移植性
- 第六章 Web客戶端和APIs
- 使用http.Client
- 調用REST API
- 并發操作客戶端請求
- 使用OAuth2
- 實現OAuth2令牌存儲接口
- 封裝http請求客戶端
- 理解GRPC的使用
- 第七章 網絡服務
- 處理Web請求
- 使用閉包進行狀態處理
- 請求參數驗證
- 內容渲染
- 使用中間件
- 構建反向代理
- 將GRPC導出為JSON API
- 第八章 測試
- 使用標準庫進行模擬
- 使用Mockgen包
- 使用表驅動測試
- 使用第三方測試工具
- 模糊測試
- 行為驅動測試
- 第九章 并發和并行
- 第十章 分布式系統
- 第十一章 響應式編程和數據流
- 第十二章 無服務器編程
- 第十三章 性能改進