文件操作
1145字约4分钟
2025-02-04
文件读取
一次性读取
byteData, _ := os.ReadFile("go_study/hello.txt")
fmt.Println(string(byteData))获取当前go文件的路径
可以通过获取当前go文件的路径,然后用相对于当前go文件的路径去打开文件
// GetCurrentFilePath 获取当前文件路径
func GetCurrentFilePath() string {
  _, file, _, _ := runtime.Caller(1)
  return file
}分片读
file, _ := os.Open("go_study/hello.txt")
defer file.Close()
for {
  buf := make([]byte, 1)
  _, err := file.Read(buf)
  if err == io.EOF {
    break
  }
  fmt.Printf("%s", buf)
}带缓冲读
按行读
file, _ := os.Open("go_study/hello.txt")
buf := bufio.NewReader(file)
for {
  line, _, err := buf.ReadLine()
  fmt.Println(string(line))
  if err != nil {
    break
  }
}指定分割符
file, _ := os.Open("go_study/hello.txt")
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanWords) // 按照单词读
//scanner.Split(bufio.ScanLines) // 按照行读
//scanner.Split(bufio.ScanRunes) // 按照中文字符读
//scanner.Split(bufio.ScanBytes) // 按照字节读读,中文会乱码
for scanner.Scan() {
  fmt.Println(scanner.Text())
}文件写入
一次性写
err := os.WriteFile("go_study/file1.txt", []byte("这是内容"), os.ModePerm)
fmt.Println(err)文件的打开方式
常见的一些打开模式
// 如果文件不存在就创建
os.O_CREATE|os.O_WRONLY
// 追加写
os.O_APPEND|os.O_WRONLY
// 可读可写
os.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_SYNC   int = syscall.O_SYNC   // 同步打开
  O_TRUNC  int = syscall.O_TRUNC  // 打开时清空文件
)文件的权限
主要用于linux系统,在windows下这个参数会被无视,代表文件的模式和权限位,
三个占位符
第一个是文件所有者所拥有的权限
第二个是文件所在组对其拥有的权限
第三个占位符是指其他人对文件拥有的权限
R:读,Read的缩写,八进制值为 4;
W:写,Write的缩写,八进制值为 2;
X:执行,Execute的缩写,八进制值为 1;0444 表示三者均为只读的权限;
0666 表示三者均为“读写”的权限;
0777 表示三者均为读写执行的权限;
0764 表示所有者有读写执行(7=4+2+1)的权限,组有读写(6=4+2)的权限,其他用户则为只读(4=4);文件复制
io.Copy(dst Writer, src Reader) (written int64, err error)将src文件的内容复制到dst文件
read, _ := os.Open("go_study/file1.txt")
write, _ := os.Create("go_study/file3.txt") // 默认是 可读可写,不存在就创建,清空文件
n, err := io.Copy(write, read)
fmt.Println(n, err)dir, _ := os.ReadDir("go_study")
for _, entry := range dir {
  info, _ := entry.Info()
  fmt.Println(entry.Name(), info.Size()) // 文件名,文件大小,单位比特
}文件读写代码示例
package main
import (
    "fmt"
    "os"
    "path/filepath"
)
// 读取文件内容
func readFile(filePath string) (string, error) {
    content, err := os.ReadFile(filePath)
    if err != nil {
        return "", err
    }
    return string(content), nil
}
// 写入文件内容
func writeFile(filePath string, content string) error {
    return os.WriteFile(filePath, []byte(content), 0644)
}
// 创建目录(如果尚不存在)
func createDirIfNotExists(dir string) error {
    if _, err := os.Stat(dir); os.IsNotExist(err) {
        err = os.MkdirAll(dir, 0755)
        if err != nil {
            return err
        }
    }
    return nil
}
func main() {
    // 定义一个目录和文件名
    dir := "data"
    err := createDirIfNotExists(dir)
    if err != nil {
        fmt.Println("创建目录错误:", err)
        return
    }
    fileName := "example.txt"
    filePath := filepath.Join(dir, fileName) // 拼接完整文件路径
    // 写入文件
    newContent := "Hello, World!"
    fmt.Println("写入的文件内容:", newContent)
    err = writeFile(filePath, newContent)
    if err != nil {
        fmt.Println("写入文件错误:", err)
        return
    }
    fmt.Println("文件写入成功")
    // 读取文件
    content, err := readFile(filePath)
    if err != nil {
        fmt.Println("读取文件错误:", err)
        return
    }
    fmt.Println("读取的文件内容:", content)
}临时文件和目录
在程序运行时,我们经常创建一些运行时用到,程序结束后就不再使用的数据。 临时目录和文件 对于上面的情况很有用,因为它不会随着时间的推移而污染文件系统。
package main
import (
    "fmt"
    "os"
    "time"
)
func main() {
    // 创建一个临时目录
    tempDir, err := os.MkdirTemp("", "tempDir-")
    if err != nil {
        fmt.Println("创建临时目录错误:", err)
        return
    }
    fmt.Println("创建的临时目录:", tempDir)
    // 在临时目录中创建一个临时文件
    tempFile, err := os.CreateTemp(tempDir, "tempFile-")
    if err != nil {
        fmt.Println("创建临时文件错误:", err)
        return
    }
    fmt.Println("创建的临时文件:", tempFile.Name())
    // 写入临时文件内容
    _, err = tempFile.Write([]byte("Hello, World!"))
    if err != nil {
        fmt.Println("写入临时文件内容错误:", err)
        return
    }
    // 关闭临时文件
    err = tempFile.Close()
    if err != nil {
        fmt.Println("关闭临时文件错误:", err)
        return
    }
    // 读取临时文件内容
    content, err := os.ReadFile(tempFile.Name())
    if err != nil {
        fmt.Println("读取临时文件内容错误:", err)
        return
    }
    fmt.Println("临时文件内容:", string(content))
    time.Sleep(time.Minute)
    // 使用 defer 确保在函数返回前删除临时目录及其内容
    defer os.RemoveAll(tempDir)
    // 使用 defer 确保在函数返回前删除临时文件
    defer os.Remove(tempFile.Name())
}