目 录CONTENT

文章目录

Go 读写文件

Sakura
2023-08-31 / 0 评论 / 0 点赞 / 6 阅读 / 4194 字 / 正在检测是否收录...

Go 读写文件

1. 读取文件

1.1 读出整个文件

func FileRead() {
	file, err := os.Open("Sakura.txt")
	if err != nil {
		log.Fatal("打开文件失败", err)
	}
	defer file.Close()

	content := make([]byte, 10)
	// n表示读取的字节数
	n, err := file.Read(content)
	if err != nil {
		log.Fatalln("读取文件失败")
		return
	}
	// 输出读取的内容
	fmt.Println(string(content[:n]))
	fmt.Println(string(content))

}

1.2 带缓冲读出文件

func FileReadBuf() {
	file, err := os.Open("Sakura.txt")
	if err != nil {
		log.Fatal("打开文件失败", err)
	}
	defer file.Close()

	// 创建一个缓冲读取器
	reader := bufio.NewReader(file)
	// 循环读出文件内容
	for {
		// 每次循环读一行
		line, err := reader.ReadString('\n')
		if err != nil {
			if err == io.EOF {
				fmt.Println(line)
				break
			} else {
				fmt.Println("其他错误:", err)
				return
			}
		} else {
			fmt.Println(line)
		}
	}
}

2. 写入文件

// 参数分别表示文件的路径,文件打开模式,权限
func OpenFile(name string, flag int, perm FileMode) (file *File, err error)

// 文件打开模式
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    // 如果可能,打开时清空文件
)

// 权限控制
const (
    // 单字符是被 String 方法用于格式化的属性缩写。
    ModeDir        FileMode = 1 << (32 - 1 - iota) // d: 目录
    ModeAppend                                     // a: 只能写入,且只能写入到末尾
    ModeExclusive                                  // l: 用于执行
    ModeTemporary                                  // T: 临时文件(非备份文件)
    ModeSymlink                                    // L: 符号链接(不是快捷方式文件)
    ModeDevice                                     // D: 设备
    ModeNamedPipe                                  // p: 命名管道(FIFO)
    ModeSocket                                     // S: Unix 域 socket
    ModeSetuid                                     // u: 表示文件具有其创建者用户 id 权限
    ModeSetgid                                     // g: 表示文件具有其创建者组 id 的权限
    ModeCharDevice                                 // c: 字符设备,需已设置 ModeDevice
    ModeSticky                                     // t: 只有 root/ 创建者能删除 / 移动文件

    // 覆盖所有类型位(用于通过 & 获取类型位),对普通文件,所有这些位都不应被设置
    ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice
    ModePerm FileMode = 0777 // 覆盖所有 Unix 权限位(用于通过 & 获取类型位)
)

权限在 Linux / Unix 设置下生效 , Window下设置无效

2.1 正常写入文件

func FileWrite() {
	// os.CREATE表示文件不存在创建
	// os.O_APPEND表示写入时追加到原来的文件后面
	file, err := os.OpenFile("Sakurasss.txt", os.O_CREATE|os.O_APPEND, 0666)
	if err != nil {
		log.Fatalln("打开文件失败", err)
	}
	defer file.Close()

	// 要写入的文件
	content := "内容"

	n, err := file.Write([]byte(content))
	if err != nil {
		log.Fatalln("写入文件失败", err)
	} else {
		fmt.Println("写入了 ", n, " 个字节")
	}
}

2.2 缓存写入文件

func main() {
	// 写入文件
	// 1.打开文件
	// 第二个参数分别表示 读写模式打开文件,追加写入,文件不存在创建一个新文件
	file, err := os.OpenFile("Sakurasss.txt", os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666)
	if err != nil {
		fmt.Println("打开文件失败")
		return
	}
	// 2.及时关闭文件
	defer file.Close()
 
	// 写入文件操作 --> IO流 --> 缓冲输出流
	writer := bufio.NewWriter(file)
	writer.WriteString("Sakura")
 
	// 流带缓冲区,所以写的数据都在缓冲区,所以要刷新数据
	writer.Flush() //刷新完数据之后 -->文件真正写入

	fmt.Println("文件写入成功")
}

3.2 文件复制

func main() {
	//定义源文件
	SourceFile := "d://PutPassword.txt"
	//定义目标文件
	TargetFile := "d://Test.txt"

	//对文件进行读取
	content, err := os.ReadFile(SourceFile)
	if err != nil {
		fmt.Println("文件读取失败")
	} else {
		//写出文件
		err := os.WriteFile(TargetFile, content, 0666)
		if err != nil {
			fmt.Println("文件写出失败")
		}
	}
}

0

评论区