Files
build-web-application-with-…/zh-tw/07.5.md
2019-06-22 23:41:28 +08:00

166 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 7.5 檔案操作
在任何計算機裝置中,檔案是都是必須的物件,而在 Web 程式設計中,檔案的操作一直是 Web 程式設計師經常遇到的問題,檔案操作在 Web 應用中是必須的,非常有用的,我們經常遇到產生檔案目錄,檔案(夾)編輯等操作,現在我把 Go 中的這些操作做一詳細總結並範例示範如何使用。
## 目錄操作
檔案操作的大多數函式都是在 os 套件裡面,下面列舉了幾個目錄操作的:
- func Mkdir(name string, perm FileMode) error
建立名稱為 name 的目錄,許可權設定是 perm例如 0777
- func MkdirAll(path string, perm FileMode) error
根據 path 建立多階層子目錄,例如 astaxie/test1/test2。
- func Remove(name string) error
刪除名稱為 name 的目錄,當目錄下有檔案或者其他目錄時會出錯
- func RemoveAll(path string) error
根據 path 刪除多階層子目錄,如果 path 是單個名稱,那麼該目錄下的子目錄全部刪除。
下面是示範程式碼:
```Go
package main
import (
"fmt"
"os"
)
func main() {
os.Mkdir("astaxie", 0777)
os.MkdirAll("astaxie/test1/test2", 0777)
err := os.Remove("astaxie")
if err != nil {
fmt.Println(err)
}
os.RemoveAll("astaxie")
}
```
## 檔案操作
### 建立與開啟檔案
建立檔案可以透過如下兩個方法
- func Create(name string) (file *File, err Error)
根據提供的檔名建立新的檔案,回傳一個檔案物件,預設許可權是 0666 的檔案,回傳的檔案物件是可讀寫的。
- func NewFile(fd uintptr, name string) *File
根據檔案描述符建立相應的檔案,回傳一個檔案物件
透過如下兩個方法來開啟檔案:
- func Open(name string) (file *File, err Error)
該方法開啟一個名稱為 name 的檔案,但是是隻讀方式,內部實現其實呼叫了 OpenFile。
- func OpenFile(name string, flag int, perm uint32) (file *File, err Error)
開啟名稱為 name 的檔案flag 是開啟的方式只讀、讀寫等perm 是許可權
### 寫入檔案
寫入檔案函式:
- func (file *File) Write(b []byte) (n int, err Error)
寫入 byte 型別的資訊到檔案
- func (file *File) WriteAt(b []byte, off int64) (n int, err Error)
在指定位置開始寫入 byte 型別的資訊
- func (file *File) WriteString(s string) (ret int, err Error)
寫入 string 資訊到檔案
寫入檔案的範例程式碼
```Go
package main
import (
"fmt"
"os"
)
func main() {
userFile := "astaxie.txt"
fout, err := os.Create(userFile)
if err != nil {
fmt.Println(userFile, err)
return
}
defer fout.Close()
for i := 0; i < 10; i++ {
fout.WriteString("Just a test!\r\n")
fout.Write([]byte("Just a test!\r\n"))
}
}
```
### 讀取檔案
讀取檔案函式:
- func (file *File) Read(b []byte) (n int, err Error)
讀取資料到 b 中
- func (file *File) ReadAt(b []byte, off int64) (n int, err Error)
從 off 開始讀取資料到 b 中
讀取檔案的範例程式碼:
```Go
package main
import (
"fmt"
"os"
)
func main() {
userFile := "asatxie.txt"
fl, err := os.Open(userFile)
if err != nil {
fmt.Println(userFile, err)
return
}
defer fl.Close()
buf := make([]byte, 1024)
for {
n, _ := fl.Read(buf)
if 0 == n {
break
}
os.Stdout.Write(buf[:n])
}
}
```
### 刪除檔案
Go 語言裡面刪除檔案和刪除資料夾是同一個函式
- func Remove(name string) Error
呼叫該函式就可以刪除檔名為 name 的檔案
## links
* [目錄](<preface.md>)
* 上一節:[範本處理](<07.4.md>)
* 下一節:[字串處理](<07.6.md>)