go的文件操作

文件读取

关于文件的读取是有些话要说的,要知道我们在实际工作中读取配置文件,很少有把路径写死的!所以读取相对路径是我们常用的,但是读取相对路径一定要注意文件和执行的主函数的位置,这一点我们下面会说。

读取绝对路径

go 复制代码
package main

import (
	"fmt"
	"os"
)

func main() {
	// 读取绝对路径
	content, err := os.ReadFile("E:\\GoSpace\\go_study\\1.txt")
	if err != nil {
		return
	}
	fmt.Println(string(content))
}

这里主函数和1.txt是放在同一目录下的

读取相对路径

go 复制代码
package main

import (
	"fmt"
	"os"
)

func main() {
	// 读取绝对路径
	content, err := os.ReadFile("config/2.txt")
	if err != nil {
		fmt.Println("出错了")
		return
	}
	fmt.Println(string(content))
}

这里主函数是和config在同一目录下,2.txt是在config里面

我使用的是golang,我们可以打开Terminal,然后我们换个执行路径

PS E:\GoSpace\go_study\config> go run ...\27.文件读取.go

出错了

分割读

go 复制代码
package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	// 读取绝对路径
	//content, err := os.ReadFile("config/2.txt")
	//if err != nil {
	//	fmt.Println("出错了")
	//	return
	//}
	//fmt.Println(string(content))

	file, err := os.Open("config/2.txt")
	if err != nil {
		panic(err)
	}
	defer file.Close()
	for {
		bytes := make([]byte, 2)
		n, err := file.Read(bytes)
		if err == io.EOF {
			break
		}
		fmt.Println(string(bytes[:n]))
	}
}

按行读

go 复制代码
package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

func main() {
	file, err := os.Open("config/2.txt")
	if err != nil {
		panic(err)
	}
	defer file.Close()
	
	buf := bufio.NewReader(file)
	for {
		line, _, err := buf.ReadLine()
		if err == io.EOF {
			break
		}
		fmt.Println(string(line))
	}
}

指定分隔符读

go 复制代码
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {

	file, err := os.Open("config/2.txt")
	if err != nil {
		panic(err)
	}
	defer file.Close()
	
	scanner := bufio.NewScanner(file)
	//scanner.Split(bufio.ScanWords)
	for scanner.Scan() {
		fmt.Println(scanner.Text())
	}
}

文件写入

基本用法

第一种

go 复制代码
package main

import "os"

func main() {
	file, err := os.OpenFile("w.txt", os.O_CREATE|os.O_WRONLY, 0666)
	if err != nil {
		panic(err)
	}
	defer file.Close()
	file.Write([]byte("你好"))
}

第二种

go 复制代码
package main

import "os"

func main() {

	err := os.WriteFile("hello.txt", []byte("hello world"), 0777)
	if err != nil {
		panic(err)
	}
	
}

效果如下:生成文件在执行的主函数同级目录下,在这里我反复强调的原因就是,本人之前跑过几个开源项目,全部都因为读取项目的配置文件启动失败,而我又没有看别人提过这个问题。说实话,Java的SpringBoot项目想出这种问题都很困难,我还是看项目的作者回复我,我才意识到这个问题!


关于读写权限

我们把刚才的代码从写改成读

go 复制代码
package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	file, err := os.OpenFile("w.txt", os.O_CREATE|os.O_WRONLY, 0666)
	if err != nil {
		panic(err)
	}
	defer file.Close()
	//file.Write([]byte("你好"))
	reader, err := io.ReadAll(file)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(reader))
}

控制打印报错:panic: read w.txt: Access is denied.

这里报错的原因是os.O_CREATE|os.O_WRONLY设置的权限不对,改成os.O_CREATE|os.O_RDONLY就可以正常执行了

文件复制

go 复制代码
package main

import (
	"io"
	"os"
)

func main() {

	file, err := os.Open("hello.txt")
	if err != nil {
		panic(err)
	}
	defer file.Close()
	file1, err := os.OpenFile("hello1.txt", os.O_CREATE|os.O_WRONLY, 0666)
	if err != nil {
		panic(err)
	}
	defer file1.Close()
	io.Copy(file1, file)
}

效果:

目录拷贝

go 复制代码
package main

import (
	"fmt"
	"os"
)

func main() {

	dir, err := os.ReadDir("day1")
	if err != nil {
		return
	}
	for _, fi := range dir {
		fmt.Println(fi.Info())
		fmt.Println(fi.Name())
		//if fi.IsDir() {
		//}
	}
}
相关推荐
leoZ23114 分钟前
AI 辅助开发的五道坎
开发语言·人工智能·视觉检测·bert·php·超分辨率重建·openvino
程序员老陆36 分钟前
Qt的QThread::usleep和FFmpeg的libavutil模块的av_usleep哪个精度高一些?
开发语言·qt·ffmpeg·音视频
东风破_1 小时前
大前端手里的 Next.js:从 #root 到 SEO,一份 HTML 的两种命运
前端·后端
IT_陈寒1 小时前
Vue的v-for不听话?我被这个Key的坑整懵了
前端·人工智能·后端
2601_963869951 小时前
【计算机毕业设计】基于Java的相框定制系统的设计与实现
java·开发语言·课程设计
众人皆醒我独醉1 小时前
训练加速实战:Flash Attention、Gradient Checkpointing 与数据流水线
后端·面试·gpu
阿黎梨梨1 小时前
Next.js 全栈开发:从 SPA 的痛点到 SSR 的破局之道
前端·后端
名字还没想好☜2 小时前
Go 的 unsafe.Pointer 实战:零拷贝 []byte↔string 转换与三条铁律
开发语言·后端·golang·go·unsafe
老孙讲技术2 小时前
周末档期厨房爆单,带宽账单也爆了——不是直播难,是主码流 + always 计划在烧钱
后端·物联网
老孙讲技术2 小时前
校园开放日前夜才说要「全校透明」?我用轻应用把 9 路教室预览和回放嵌进了校园后台
后端·物联网