基本介绍
-
输入流和输出流
-
os.File 封装所有文件相关操作,File是一个结构体
文件操作
打开文件和关闭文件
打开文件使用的是os包下的Open
,OpenFile
函数
func Open(name string) (file *File, err error)
Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。如果出错,错误底层类型是*PathError。
func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
OpenFile是一个更一般性的文件打开函数,大多数调用者都应用Open或Create代替本函数。它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是*PathError。
import "os"
func OpenFileTest() {
file, err := os.Open("D:\\GoWorkplace\\src\\project01\\resources\\test.txt") // 用open函数直接打开
if err != nil {
fmt.Println("open file err: ", err)
return
}
fmt.Println("file: %v", file)
err = file.Close()
if err != nil {
fmt.Println("close file err: ", err)
}
}
func OpenFileTest2() {
file, err := os.OpenFile("D:\\GoWorkplace\\src\\project01\\resources\\test.txt", os.O_WRONLY | os.O_CREATE, 0666) // 用openFile函数直接打开
if err != nil {
fmt.Println("open file err: ", err)
return
}
fmt.Println("file: %v", file)
err = file.Close()
if err != nil {
fmt.Println("close file err: ", err)
}
}
关闭文件用Close
函数,一般会结合defer
,在函数执行完毕后自动释放文件句柄
读取文件内容
读取文件内容可以用bufio
,ioutil
两个包
func FileReaderTest() {
file, err := os.Open("D:\\GoWorkplace\\src\\project01\\resources\\test.txt")
if err != nil {
fmt.Println("open file err: ", err)
return
}
defer file.Close()
reader := bufio.NewReader(file)
for {
str, err := reader.ReadString(\'\n\')
fmt.Print(str)
if err == io.EOF {
break
}
}
fmt.Println("read finish...")
}
func IOUtilTest() {
file := "../resources/test.txt"
content, err := ioutil.ReadFile(file)
if err != nil {
fmt.Printf("read file err = %v \n", err)
}
fmt.Println(string(content))
}
修改文件内容
可以用bufio包下的write函数,也可以使用ioutil包下的write函数
func WriteFileTest3() {
filePath := "../resources/test.txt"
file, err := os.OpenFile(filePath, os.O_WRONLY | os.O_APPEND, 0666) // 需要选择模式
if err != nil {
fmt.Printf("oped file err = %v \n", err)
return
}
defer file.Close()
str := "ABC! ENGLISH \r\n"
writer := bufio.NewWriter(file)
for i := 0; i < 5; i++ {
writer.WriteString(str)
}
// bufio.writer 是缓存写入,所以需要Flush才能真正写入到文件
writer.Flush()
}
func ReadAndWriteFileTest() {
a := "../resources/a.txt"
test := "../resources/test.txt"
content, _ := ioutil.ReadFile(test)
ioutil.WriteFile(a, content, 0666) // 一次性创建清空写入文件
}
判断文件或文件夹是否存在
可以使用os.Stat()函数返回单额错误值进行判断
func Exists(path string) (bool error) {
_, err := os.Stat(path)
iif err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return false, err
}
拷贝文件
缺少很多err的判断
func CopyFileTest(){
a := "../resources/a.txt"
b := "../resources/b.txt"
fa, _ := os.Open(a)
fb, _ := os.OpenFile(b, os.O_WRONLY | os.O_CREATE, 0666)
defer fa.Close()
defer fb.Close()
reader := bufio.NewReader(fa)
writer := bufio.NewWriter(fb)
io.Copy(writer, reader)
}
请发表评论