1. 创建文件
func main() {// 创建文件f, err := os.Create("asong.txt")if err != nil {log.Fatalf("create file failed err=%s\n", err)}}
- 参数传 绝对路径 和 相对路径 都可以
- 如果原来的文件存在, 就创建一个空文件覆盖它
2. 打开文件
//以只读方式打开文件func main() {//打开文件file, err := os.Open("/yourPath/test.txt")if err != nil {panic(err.Error())}//关闭文件defer file.Close()}
//可以是读写方式打开文件, 或者有一些其他操作, 没有文件的时候直接创建文件func main() {//打开文件f, _ := os.OpenFile("F:\\goworkspace\\caixukun\\a.txt", os.O_WRONLY|os.O_CREATE, 0666)//关闭文件defer file.Close()}
3. 获取文件信息
func main() {// 打开文件f, err := os.Open("F:\\goworkspace\\caixukun\\b.txt")if err != nil {log.Fatalf("create file failed err=%s\n", err)}fileInfo, err := f.Stat()if err != nil {log.Fatalf("get file info failed err=%s\n", err)}fmt.Println("IsDir = ", fileInfo.IsDir())fmt.Println("ModTime = ", fileInfo.ModTime())fmt.Println("Mode = ", fileInfo.Mode())fmt.Println("Name = ", fileInfo.Name())fmt.Println("Size = ", fileInfo.Size())fmt.Println("Sys = ", fileInfo.Sys())}

4. 改变文件权限
func main() {// 打开文件f, err := os.Open("F:\\goworkspace\\caixukun\\b.txt")if err != nil {log.Fatalf("create file failed err=%s\n", err)}err = f.Chmod(0777)if err != nil{log.Fatalf("chmod file failed err=%s\n", err)}// 改变拥有者err = f.Chown(os.Getuid(), os.Getgid())if err != nil{log.Fatalf("chown file failed err=%s\n", err)}}
5. 删除文件
func main() {// 删除文件err = os.Remove("asong.txt")if err != nil{log.Fatalf("remove file failed err=%s\n", err)}}
6. 写文件
6.1 快速写
func main() {err := os.WriteFile("F:\\goworkspace\\caixukun\\b.txt", []byte("一段二进制数据"), 0666)}//os与ioutil是一样的东西//建议不要使用ioutil; go官方会逐渐废弃不再维护func main() {ioutil.WriteFile("F:\\goworkspace\\caixukun\\d.txt", []byte("66"), 0666)}
- 如果文件不存在则自动创建文件后写入
- 写入是覆盖写入, 文件原有的数据则会被删除
6.2 按行写文件
func main() {// 打开文件f, err := os.OpenFile(filename, os.O_WRONLY, 0666)_,err := f.WriteString(line + "\n")}
- 必须先有文件才能按行写入
- 如果文件里已经有内容了, 则会从第1个字符 开始逐一覆盖字符, 超过原来的字符数量追加在后面
6.3 使用缓冲区写入
func main() {f, _ := os.OpenFile("F:\\goworkspace\\caixukun\\c.txt", os.O_WRONLY, 0666)// 为这个文件创建buffered writerbufferedWriter := bufio.NewWriter(f)for i := 0; i < 10; i++ {// 写字符串到bufferbytesWritten, err := bufferedWriter.WriteString(strconv.Itoa(i))if err != nil {return}log.Printf("Bytes written: %d\n", bytesWritten)}// 写内存buffer到硬盘if err := bufferedWriter.Flush(); err != nil {panic(err)}defer f.Close()}
- 与按行写行为一致
- 必须先有文件才能按行写入
- 如果文件里已经有内容了, 则会从第1个字符 开始逐一覆盖字符, 超过原来的字符数量追加在后面
6.4 偏移量写入
func main() {f, _ := os.OpenFile("F:\\goworkspace\\caixukun\\b.txt", os.O_WRONLY, 0666)replaceSplace := []byte{0x6F, // o0x6E, // n}f.WriteAt(replaceSplace, 2) //第二个入参是偏移量, 会直接覆盖f.Close()}
- 可以做追加写操作
6.5 追加写
func main() {f, _ := os.OpenFile("F:\\goworkspace\\caixukun\\b.txt", os.O_WRONLY|os.O_APPEND, 0666)f.Write([]byte("---追加的内容---"))f.Close()}
6.6 创建并写入文件
func main() {//第二个参数可以设置多个功能f, _ := os.OpenFile("F:\\goworkspace\\caixukun\\a.txt", os.O_WRONLY|os.O_CREATE, 0666)f.WriteString("写入的文字")f.Close()}
详细请看
7. 读取文件
7.1 读取全部内容
func main() {filename := "F:\\goworkspace\\caixukun\\a.txt"data, _ := os.ReadFile(filename)fmt.Println(string(data))}
//建议不要使用ioutilfunc main() {filename := "F:\\goworkspace\\caixukun\\a.txt"file, _ := os.Open(filename)data, _ := ioutil.ReadAll(file)fmt.Println(string(data))}
7.2 按行读取文件
官方推荐按行读取使用 scanner
func main() {filename := "F:\\goworkspace\\caixukun\\a.txt"file, _ := os.Open(filename)defer file.Close()scanner := bufio.NewScanner(file)scanner.Split(bufio.ScanLines) //可省略, 默认就是按行读取for scanner.Scan() {line := scanner.Text()fmt.Printf("%s\n", line)}if err := scanner.Err(); err != nil {log.Printf("Cannot scanner text file: %s, err: [%v]", filename, err)return}return}
7.3 按块读取文件
func main() {filename := "F:\\goworkspace\\caixukun\\a.txt"file, _ := os.OpenFile(filename, os.O_RDONLY, 0666)defer file.Close()buf := make([]byte, 3) // 每次读取 3 个字节for {n, _ := file.Read(buf)if n == 0 {break}log.Printf("writeByte %s every read 2 byte is %s\n", filename, string(buf[:n]))}return}
8. 复制文件
func main() {//源文件filename := "F:\\goworkspace\\caixukun\\a.txt"file, _ := os.Open(filename)defer file.Close()//目标文件newFile, _ := os.Create("F:\\goworkspace\\caixukun\\newFile.txt")defer newFile.Close()//复制操作nBytes, _ := io.Copy(newFile, file) //注意两个参数的顺序fmt.Printf("复制了 %d 字节数据", nBytes)}
