這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
go
檔案的相關操作函數在os
包下,可以查看os包官方文檔來學習。
建立檔案並寫入內容
建立檔案和寫入需要用到兩個函數:
func Create(name string) (*File, error) func (f *File) Write(b []byte) (n int, err error)
具體的代碼如下:
package mainimport ( "log" "os")func main() { file, createErr := os.Create("/Users/deweixu/demo.txt") if createErr != nil { log.Fatal(createErr) } _, writeErr := file.Write([]byte("建立一個檔案,並寫入內容。")) if writeErr != nil { log.Fatal(writeErr) } closeErr := file.Close() if closeErr != nil { log.Fatal(closeErr) }}
$ go run create_write.go
就會看到建立了檔案demo.txt
, 並寫入了內容。
讀取檔案內容
package mainimport ( "fmt" "log" "os")func main() { //開啟檔案 file, err := os.Open("/Users/deweixu/demo.txt") if err != nil { log.Fatal(err) } //建立一個緩衝區, 每次讀取1024 byte buf := make([]byte, 1024) for { len, readErr := file.Read(buf) if len == 0 { break } if readErr != nil { log.Fatal(err) } fmt.Printf("%s", string(buf)) } fmt.Print("\n")}
$ go run read.go
就可以看見讀取成功。
在os
包下還有有關目錄的操作函數和其他的功能,可以查閱相關的文檔來學習使用。
複製檔案
package mainimport ( "log" "os")func main() { //建立一個新檔案 dstFile, createErr := os.Create("/Users/deweixu/demo-cp.txt") if createErr != nil { log.Fatal(createErr) } //開啟源檔案 srcFile, openErr := os.Open("/Users/deweixu/demo.txt") if openErr != nil { log.Fatal(openErr) } //建立一個緩衝區, 每次讀取1024 byte buf := make([]byte, 1024) for { len, readErr := srcFile.Read(buf) if len == 0 { break } if readErr != nil { log.Fatal(readErr) } _, writeErr := dstFile.Write(buf) if writeErr != nil { log.Fatal(writeErr) } } //忽略Close 錯誤 dstFile.Close() srcFile.Close()}
go run cp.go
完成複製。
因為File
實現了Writer
和Reader
介面,所以可以調用io
和io/ioutil
包下的一些函數來操作檔案,比如上面的複製功能可以用io
包下的這些函數來實現
func Copy(dst Writer, src Reader) (written int64, err error)func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error)func CopyN(dst Writer, src Reader, n int64) (written int64, err error)
具體代碼如下:
package mainimport ( "io" "log" "os")func main() { //建立一個新檔案 dstFile, createErr := os.Create("/Users/deweixu/demo-cp.txt") if createErr != nil { log.Fatal(createErr) } //開啟源檔案 srcFile, openErr := os.Open("/Users/deweixu/demo.txt") if openErr != nil { log.Fatal(openErr) } //建立一個緩衝區, 每次讀取1024 byte buf := make([]byte, 1024) _, cpErr := io.CopyBuffer(dstFile, srcFile, buf) if cpErr != nil { log.Fatal(cpErr) } //忽略Close 錯誤 dstFile.Close() srcFile.Close()}
區分開啟的File
是目錄還是檔案
os
包下還有關於目錄操作的函數,可查閱文檔使用,這裡說說區分檔案和目錄的功能,需要用到stat
函數。
package mainimport ( "fmt" "log" "os")func main() { file, err := os.Open("/Users/deweixu") if err != nil { log.Fatal(err) } fileInfo, statErr := file.Stat() if statErr != nil { log.Fatal(statErr) } isDir := fileInfo.IsDir() fmt.Printf("%t\n", isDir)}