go
文件的相关操作函数在os
包下,可以查看os包官方文档来学习。
创建文件并写入内容
创建文件和写入需要用到两个函数:
func Create(name string) (*File, error)
func (f *File) Write(b []byte) (n int, err error)
具体的代码如下:
package main
import (
"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 main
import (
"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 main
import (
"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 main
import (
"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 main
import (
"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)
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。