2.标准库os模块之文件读操作
这里结束和file结构体相关的文件读操作
(1).打开和关闭文件
- 假如为空就报错
假如文件为空,不会再此创建,而会报错
open, err := os.Open("test.txt") // 返回值: 文件对象和错误信息
package main import ( "fmt" "os" ) func openClose() { open, err := os.Open("test.txt") // 返回值: 文件对象和错误信息 if err != nil { fmt.Printf("%v", err) } else { fmt.Printf("已经打开的文件名是: %v\n", open.Name()) } open.Close() // 关闭文件 } func main() { openClose() }
- 假如为空就创建
文件 a.txt是不存在的,我们直接执行就会被创建
package main import ( "fmt" "os" ) func openClose() { open, err := os.OpenFile("a.txt", os.O_RDWR|os.O_CREATE, 755) // 参数: 文件名. 文件的权限是读和创建 . 主用户可以读写执行其他的读和执行 if err != nil { fmt.Printf("%v", err) } else { fmt.Printf("已经打开的文件名是: %v\n", open.Name()) } open.Close() // 关闭文件 } func main() { openClose() }
(2).读取文件
假如说:我们的缓冲区不够大,文件内容读不完。那么我们有两种办法:第一种使用for循环进行一直读取,直到报错信息等于 io.EOF
- 第一种for循环读取 read
package main import ( "fmt" "io" "os" ) func readOps() { open, err := os.Open("test.txt") // 返回值: 文件对象和错误信息 for { if err != nil { fmt.Printf("%v", err) } else { fmt.Printf("已经打开的文件名是: %v\n", open.Name()) bytes := make([]byte, 10) //创建一个缓冲区,类型是byte数组,大小是10个字节 read, err := open.Read(bytes) // 进行读取的操作,里面的参数是一个缓冲区 byte数组.---->返回的参数是: 占用的字节数 if err == io.EOF { //假如说这个错误等于他那么我们就终止循环 break } else { fmt.Printf("%v\n", read) fmt.Printf("读取到的内容是:%v\n", string(bytes)) //打印我们读取的文件,里面的参数是缓冲区 } } } open.Close() // 关闭文件 } func main() { readOps() }
- 第二种空间足够大 read
package main import ( "fmt" "os" ) func readOps() { open, err := os.Open("test.txt") // 返回值: 文件对象和错误信息 if err != nil { fmt.Printf("%v", err) } else { fmt.Printf("已经打开的文件名是: %v\n", open.Name()) bytes := make([]byte, 100) //创建一个缓冲区,类型是byte数组,大小是10个字节 read, err := open.Read(bytes) // 进行读取的操作,里面的参数是一个缓冲区 byte数组.---->返回的参数是: if err != nil { fmt.Printf("%v", err) } else { fmt.Printf("%v\n", read) fmt.Printf("读取到的内容是:%v\n", string(bytes)) //打印我们读取的文件,里面的参数是缓冲区 } } open.Close() // 关闭文件 } func main() { readOps() }
- 从指定的字节开始读取 reatAt
package main import ( "fmt" "os" ) func readOps() { open, err := os.Open("test.txt") // 返回值: 文件对象和错误信息 if err != nil { fmt.Printf("%v", err) } else { fmt.Printf("已经打开的文件名是: %v\n", open.Name()) bytes := make([]byte, 100) //创建一个缓冲区,类型是byte数组,大小是10个字节 at, _ := open.ReadAt(bytes, 3) // 从第几个字节开始读取,前面的不读取 fmt.Printf("读取的字节个数是:%v\n", at) fmt.Printf("读取的内容是:%v\n", string(bytes)) } open.Close() // 关闭文件 } func main() { readOps() }
- 遍历一个目录
package main import ( "fmt" "os" ) func readOps() { dir, _ := os.ReadDir("a") for _, v := range dir { fmt.Printf("是否是一个目录: %v", v.IsDir()) fmt.Printf("目录名字: %v", v.Name()) } } func main() { readOps() }