1. 创建文件

  1. func main() {
  2. // 创建文件
  3. f, err := os.Create("asong.txt")
  4. if err != nil {
  5. log.Fatalf("create file failed err=%s\n", err)
  6. }
  7. }
  • 参数传 绝对路径 和 相对路径 都可以
  • 如果原来的文件存在, 就创建一个空文件覆盖它

2. 打开文件

  1. //以只读方式打开文件
  2. func main() {
  3. //打开文件
  4. file, err := os.Open("/yourPath/test.txt")
  5. if err != nil {
  6. panic(err.Error())
  7. }
  8. //关闭文件
  9. defer file.Close()
  10. }
  1. //可以是读写方式打开文件, 或者有一些其他操作, 没有文件的时候直接创建文件
  2. func main() {
  3. //打开文件
  4. f, _ := os.OpenFile("F:\\goworkspace\\caixukun\\a.txt", os.O_WRONLY|os.O_CREATE, 0666)
  5. //关闭文件
  6. defer file.Close()
  7. }

3. 获取文件信息

  1. func main() {
  2. // 打开文件
  3. f, err := os.Open("F:\\goworkspace\\caixukun\\b.txt")
  4. if err != nil {
  5. log.Fatalf("create file failed err=%s\n", err)
  6. }
  7. fileInfo, err := f.Stat()
  8. if err != nil {
  9. log.Fatalf("get file info failed err=%s\n", err)
  10. }
  11. fmt.Println("IsDir = ", fileInfo.IsDir())
  12. fmt.Println("ModTime = ", fileInfo.ModTime())
  13. fmt.Println("Mode = ", fileInfo.Mode())
  14. fmt.Println("Name = ", fileInfo.Name())
  15. fmt.Println("Size = ", fileInfo.Size())
  16. fmt.Println("Sys = ", fileInfo.Sys())
  17. }

image.png

4. 改变文件权限

  1. func main() {
  2. // 打开文件
  3. f, err := os.Open("F:\\goworkspace\\caixukun\\b.txt")
  4. if err != nil {
  5. log.Fatalf("create file failed err=%s\n", err)
  6. }
  7. err = f.Chmod(0777)
  8. if err != nil{
  9. log.Fatalf("chmod file failed err=%s\n", err)
  10. }
  11. // 改变拥有者
  12. err = f.Chown(os.Getuid(), os.Getgid())
  13. if err != nil{
  14. log.Fatalf("chown file failed err=%s\n", err)
  15. }
  16. }

5. 删除文件

  1. func main() {
  2. // 删除文件
  3. err = os.Remove("asong.txt")
  4. if err != nil{
  5. log.Fatalf("remove file failed err=%s\n", err)
  6. }
  7. }

6. 写文件

6.1 快速写

  1. func main() {
  2. err := os.WriteFile("F:\\goworkspace\\caixukun\\b.txt", []byte("一段二进制数据"), 0666)
  3. }
  4. //os与ioutil是一样的东西
  5. //建议不要使用ioutil; go官方会逐渐废弃不再维护
  6. func main() {
  7. ioutil.WriteFile("F:\\goworkspace\\caixukun\\d.txt", []byte("66"), 0666)
  8. }
  • 如果文件不存在则自动创建文件后写入
  • 写入是覆盖写入, 文件原有的数据则会被删除

6.2 按行写文件

  1. func main() {
  2. // 打开文件
  3. f, err := os.OpenFile(filename, os.O_WRONLY, 0666)
  4. _,err := f.WriteString(line + "\n")
  5. }
  • 必须先有文件才能按行写入
  • 如果文件里已经有内容了, 则会从第1个字符 开始逐一覆盖字符, 超过原来的字符数量追加在后面

6.3 使用缓冲区写入

  1. func main() {
  2. f, _ := os.OpenFile("F:\\goworkspace\\caixukun\\c.txt", os.O_WRONLY, 0666)
  3. // 为这个文件创建buffered writer
  4. bufferedWriter := bufio.NewWriter(f)
  5. for i := 0; i < 10; i++ {
  6. // 写字符串到buffer
  7. bytesWritten, err := bufferedWriter.WriteString(strconv.Itoa(i))
  8. if err != nil {
  9. return
  10. }
  11. log.Printf("Bytes written: %d\n", bytesWritten)
  12. }
  13. // 写内存buffer到硬盘
  14. if err := bufferedWriter.Flush(); err != nil {
  15. panic(err)
  16. }
  17. defer f.Close()
  18. }
  • 与按行写行为一致
  • 必须先有文件才能按行写入
  • 如果文件里已经有内容了, 则会从第1个字符 开始逐一覆盖字符, 超过原来的字符数量追加在后面

6.4 偏移量写入

  1. func main() {
  2. f, _ := os.OpenFile("F:\\goworkspace\\caixukun\\b.txt", os.O_WRONLY, 0666)
  3. replaceSplace := []byte{
  4. 0x6F, // o
  5. 0x6E, // n
  6. }
  7. f.WriteAt(replaceSplace, 2) //第二个入参是偏移量, 会直接覆盖
  8. f.Close()
  9. }
  • 可以做追加写操作

6.5 追加写

  1. func main() {
  2. f, _ := os.OpenFile("F:\\goworkspace\\caixukun\\b.txt", os.O_WRONLY|os.O_APPEND, 0666)
  3. f.Write([]byte("---追加的内容---"))
  4. f.Close()
  5. }

6.6 创建并写入文件

  1. func main() {
  2. //第二个参数可以设置多个功能
  3. f, _ := os.OpenFile("F:\\goworkspace\\caixukun\\a.txt", os.O_WRONLY|os.O_CREATE, 0666)
  4. f.WriteString("写入的文字")
  5. f.Close()
  6. }

详细请看
image.png

7. 读取文件

7.1 读取全部内容

  1. func main() {
  2. filename := "F:\\goworkspace\\caixukun\\a.txt"
  3. data, _ := os.ReadFile(filename)
  4. fmt.Println(string(data))
  5. }
  1. //建议不要使用ioutil
  2. func main() {
  3. filename := "F:\\goworkspace\\caixukun\\a.txt"
  4. file, _ := os.Open(filename)
  5. data, _ := ioutil.ReadAll(file)
  6. fmt.Println(string(data))
  7. }

7.2 按行读取文件

官方推荐按行读取使用 scanner

  1. func main() {
  2. filename := "F:\\goworkspace\\caixukun\\a.txt"
  3. file, _ := os.Open(filename)
  4. defer file.Close()
  5. scanner := bufio.NewScanner(file)
  6. scanner.Split(bufio.ScanLines) //可省略, 默认就是按行读取
  7. for scanner.Scan() {
  8. line := scanner.Text()
  9. fmt.Printf("%s\n", line)
  10. }
  11. if err := scanner.Err(); err != nil {
  12. log.Printf("Cannot scanner text file: %s, err: [%v]", filename, err)
  13. return
  14. }
  15. return
  16. }

7.3 按块读取文件

  1. func main() {
  2. filename := "F:\\goworkspace\\caixukun\\a.txt"
  3. file, _ := os.OpenFile(filename, os.O_RDONLY, 0666)
  4. defer file.Close()
  5. buf := make([]byte, 3) // 每次读取 3 个字节
  6. for {
  7. n, _ := file.Read(buf)
  8. if n == 0 {
  9. break
  10. }
  11. log.Printf("writeByte %s every read 2 byte is %s\n", filename, string(buf[:n]))
  12. }
  13. return
  14. }

8. 复制文件

  1. func main() {
  2. //源文件
  3. filename := "F:\\goworkspace\\caixukun\\a.txt"
  4. file, _ := os.Open(filename)
  5. defer file.Close()
  6. //目标文件
  7. newFile, _ := os.Create("F:\\goworkspace\\caixukun\\newFile.txt")
  8. defer newFile.Close()
  9. //复制操作
  10. nBytes, _ := io.Copy(newFile, file) //注意两个参数的顺序
  11. fmt.Printf("复制了 %d 字节数据", nBytes)
  12. }