1.1.1. 一、打开文件的方式:
写文件的时候,要以写方式open文件。文档:https://golang.org/pkg/os/
使用的函数: func OpenFile(name string, flag int, perm FileMode) (*File, error)
参数:
- name:文件的路径+名字。
- int:文件的打开方式,只读 O_RDONLY 、只写 O_WRONLY、读写 O_RDWR 等(可以组合使用),如下 :
const (
O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
O_RDWR int = syscall.O_RDWR // 读写模式打开文件
O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件
O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在
O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O
O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件
)
- perm :这个是控制文件的权限,在linux系统下有用。
1.1.2. 二、示例4种方式写文件:
1、创建一个文件,向文件里面写一些内容。
func main() {
filePath := "C:/Users/Administrator/Desktop/testWrite.txt";
// O_CREATE 如果不存在将创建一个新文件,并且以写(O_WRONLY)的方式打开文件
// 0666 这个是文件的权限,所有者、所在组、其他人
file, err := os.OpenFile(filePath,os.O_WRONLY | os.O_CREATE,0666)
if err != nil {
fmt.Println("打开文件错误。。。")
return
}
defer file.Close() //关闭文件
writer := bufio.NewWriter(file)
for i:=0; i<5; i++ {
writer.WriteString("你好 \r\n")
}
// 因为 writer 带缓存,数据先写到writer中,超出缓存后才写到硬盘。
// 所以最后需要把缓存中剩余的数据Flush()到硬盘
writer.Flush()
}
使用到的API:
1、打开文件:
os.OpenFile(filePath,os.O_WRONLY | os.O_CREATE,0666)
。O_CREATE 如果不存在将创建一个新文件,并且以写(O_WRONLY)的方式打开文件。如果文件存在,将被覆盖。
0666 这个是文件的权限,是否目录,所有者、所在组、其他人。
2、关闭文件 :file.Close()。
3、创建写缓冲:bufio.NewWriter(file)
4、写文件内容:writer.WriteString("你好 \r\n")
5、把内容刷新到硬盘:writer.Flush(),因为 writer 带缓存,数据先写到writer中,超出缓存后才写到硬盘。所以最后需要把缓存中剩余的数据Flush()到硬盘。
2、打开一个已经存在的文件,清空原来的内容,然后向文件里面写数据。
如果已经知道文件存在,想覆盖原来的内容,可以使用下面的方式打开文件。(文件不存在,会出现err错误)
file, err := os.OpenFile(filePath,os.O_WRONLY | os.O_TRUNC,0666)
os.O_TRUNC 表示清空原来的内容。
3、向已经存在的文件末尾追加内容。
向已经存在的文件末尾追加内容,打开方式如下:(文件不存在,会出现err错误)
file, err := os.OpenFile(filePath,os.O_WRONLY | os.O_APPEND,0666)
os.O_APPEND 表示向末尾追加内容。
4、读取已经存在的文件,并且向文件末尾追加内容。
filePath := "C:/Users/Administrator/Desktop/testWrite.txt";
// O_CREATE
file, err := os.OpenFile(filePath,os.O_RDWR | os.O_APPEND,0666)
if err != nil {
fmt.Println("打开文件错误。。。")
return
}
defer file.Close() //关闭文件
// 创建一个reader,默认带4096个字节的缓冲。
reader := bufio.NewReader(file)
//循环读取文件的内容
for {
// 读到一个换行\n就结束。当前只读取一行。存储到str变量。
str, readErr := reader.ReadString('\n')
fmt.Print(str) //输出读取到的内容
if readErr == io.EOF { // io.EOF 表示文件末尾
fmt.Println("读取完毕。。。。")
break
}
}
// 写文件
writer := bufio.NewWriter(file)
for i:=0; i<5; i++ {
writer.WriteString("你好123tttxx追加 \r\n")
}
// 因为 writer 带缓存,数据先写到writer中,超出缓存后才写到硬盘。
// 所以最后需要把缓存中剩余的数据Flush()到硬盘
writer.Flush()
注意:读写os.O_RDWR 和 追加 os.O_APPEND,要先读,不能先写。如果先写文件,那读出来的是空字符串。
1.1.3. 三、从一个文件中读取内容,写入另一个文件。
使用 ioutil 包,把一个文件的内容读取出来,写入另一个文件。
// 读文件
data, err := ioutil.ReadFile("C:/Users/Administrator/Desktop/test.txt")
if err != nil {
fmt.Printf("读取文件失败。。。。%v",err)
}
// 写文件
destPath := "C:/Users/Administrator/Desktop/dest.txt"
writeErr := ioutil.WriteFile(destPath, data, 0666)
if writeErr != nil {
fmt.Printf("写文件失败。。。。%v",err)
}
说明:
1、如果读取的文件 test.txt 不存在,会报 err 错误。
2、写的文件 dest.txt 可以不存在,如果文件 dest.txt 存在,原来的内容会被清空,写入新的内容。
1.1.4. 四、判断文件是否存在。
使用os.Stat 获取文件或文件夹的信息。如果有错误,判断是不是文件不存在os.IsNotExist 的错误。如下:
info, err := os.Stat("C:/Users/Administrator/Desktop/test.txt")
if err != nil { //有错误
if os.IsNotExist(err) {
fmt.Println("文件/目录 不存在。。。")
}else {
fmt.Println("其他错误 。。。")
}
return
}
fmt.Printf("文件名=%v \n",info.Name())
fmt.Printf("文件大小=%v 字节\n",info.Size())
fmt.Printf("是否文件夹=%v \n",info.IsDir())
说明:获取 文件/文件夹 信息的时候,如果有错,返回一个错误信息。判断这个错误信息是不是os.IsNotExist 来确定是否文件不存在引起的错误。
1.1.5. 五、拷贝文件。
可以使用 io 包的 func Copy(dst Writer, src Reader) (written int64, err error)
函数实现拷贝文件。返回拷贝的字节数,如果有错误返回遇到的第一个错误。
// 拷贝文件的函数
func CopyFile(dstFileName string, srcFileName string) (written int64, err error) {
srcFile, err := os.Open(srcFileName)
if err != nil {
fmt.Printf("打开文件失败 err=%v\n", err)
return
}
defer srcFile.Close()
// 通 过 srcfile , 获 取 到 Reader
reader := bufio.NewReader(srcFile)
//打开 dstFileName
dstFile, err := os.OpenFile(dstFileName, os.O_WRONLY | os.O_CREATE, 0666)
if err != nil {
fmt.Printf("打开文件失败 err=%v\n", err)
return
}
// 通 过 dstFile, 获 取 到 Writer
writer := bufio.NewWriter(dstFile)
defer dstFile.Close()
return io.Copy(writer, reader)
}
func main() {
_, err := CopyFile("C:/Users/Administ1rator/Desktop/dstFile.jpg",
"C:/Users/Administrator/Desktop/test.jpg")
if err != nil {
fmt.Printf("拷贝失败 err=%v \n", err)
}
}
说明:主要是打开文件,并且把源文件的Reader、目标文件的 Writer 传递给io 包的
func Copy(dst Writer, src Reader) (written int64, err error)
函数