Golang初学:文件操作,标准库

news/2024/9/17 3:33:38

go version go1.22.1 windows/amd64

Windows 11 + amd64

x86_64 x86_64 GNU/Linux

---

 

序章

读取文件内容,写入新文件(可能存在、也可能不存在)。

 

相关标准库

  • io
  • fs
  • os
  • path
  • filepath

 

Show Code

func CopyFile() {// 测试文件拷贝var fsrc, fdst stringvar start time.Timefsrc = "D:/test/fs01.go"fdst = "D:/test/fs01.go.bak"start = time.Now()copyFromTo(fsrc, fdst)fmt.Println(fsrc, "耗时:", time.Now().Sub(start))// 第二次测试时,文件已存在copyFromTo(fsrc, fdst)fsrc = "D:/test/VTS_01_1.VOB"fdst = "D:/test/VTS_01_1.VOB.bak"start = time.Now()copyFromTo(fsrc, fdst)fmt.Println(fsrc, "耗时:", time.Now().Sub(start))copyFromTo(fsrc, fdst)
}// 拷贝文件 fsrc 到 fdst
func copyFromTo(fsrc, fdst string) {fsrcp := openFileSrc(fsrc)fdstp := openFileDstForWrite(fdst)copyFileData(fsrcp, fdstp)}// 打开文件:只读 os.Open(.)
// 错误时退出程序
func openFileSrc(path string) (fr *os.File) {fr, err := os.Open(path)if err != nil {log.Fatal(err)}return
}// 打开文件:可读写
// 不存在,先新建
// 已存在,先清空
// 返回 fw
func openFileDstForWrite(path string) (fw *os.File) {// 这里的 参数2、参数3 还有不同的配置fw, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0644)if err != nil {log.Fatal(err)}return
}// 拷贝文件数据
func copyFileData(fsrcp, fdstp *os.File) {// 缓冲区:字节分片var buf = make([]byte, 1024)var rc intvar rerr errorvar testTotal intfor {if rc, rerr = fsrcp.Read(buf); rerr == nil {// 已读取 rc 字节到 buf// 写入 fdstpfdstp.Write(buf[:rc])testTotal += rc} else if rerr == io.EOF {log.Println("写入文件数据成功...结束。", rerr, "testTotal=", testTotal)break} else {log.Fatal("写入文件数据失败...", rerr)}}
}

 

官文资料

std: os 文件打开 函数

// https://pkg.go.dev/os@go1.22.3/*
Open opens the named file for reading. 
If successful, methods on the returned file can be used for reading; 
the associated file descriptor has mode O_RDONLY. 
If there is an error, it will be of type *PathError.
*/
func Open(name string) (*File, error)/*
OpenFile is the generalized open call; most users will use Open or Create instead.
示例:
f, err := os.OpenFile("notes.txt", os.O_RDWR|os.O_CREATE, 0644)
*/
func OpenFile(name string, flag int, perm FileMode) (*File, error)

注意,这里的 flag、perm 参数设置很关键。

 

std:os 文件读取、写入 方法——*File 的方法

/*
Read reads up to len(b) bytes from the File and stores them in b. 
It returns the number of bytes read and any error encountered. 
At end of file, Read returns 0, io.EOF.
*/
func (f *File) Read(b []byte) (n int, err error)
// 注意,返回的 err 为 io.EOF 也是成功,表示结束,需要 退出读取/*
Write writes len(b) bytes from b to the File. 
It returns the number of bytes written and an error, if any. 
Write returns a non-nil error when n != len(b).
*/
func (f *File) Write(b []byte) (n int, err error)
// 注意,参数 b 不一定是读取 全部字节,因此,代码里使用了 buf[:rc]

 

测试

结果:成功。

2024/05/15 21:01:51 写入文件数据成功...结束。 EOF testTotal= 299
D:/test/fs01.go 耗时: 20.9464ms
2024/05/15 21:01:51 写入文件数据成功...结束。 EOF testTotal= 299
2024/05/15 21:01:52 写入文件数据成功...结束。 EOF testTotal= 24037376
D:/test/VTS_01_1.VOB 耗时: 143.7081ms
2024/05/15 21:01:52 写入文件数据成功...结束。 EOF testTotal= 24037376

截图:

 

END.

ben发布于博客园

本文链接:

https://www.cnblogs.com/luo630/p/18194645

ben发布于博客园

参考资料

1、golang 相关 std

https://pkg.go.dev/std

2、

 

ben发布于博客园

ben发布于博客园

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/31992.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

OpenPCDet训练自定义数据

官网也提供了步骤,这里详细介绍下训练自己数据的过程以及中间遇到的一些问题。训练模型这里采用PointRCNN,具体的介绍参考:https://www.cnblogs.com/xiaxuexiaoab/p/18033887 一、准备数据集 数据集这一块我们需要准备好原始点云数据、物体目标标注文件、以及训练和验证对应…

PPO-KL散度近端策略优化玩cartpole游戏

其实KL散度在这个游戏里的作用不大,游戏的action比较简单,不像LM里的action是一个很大的向量,可以直接用surr1,最大化surr1,实验测试确实是这样,而且KL的系数不能给太大,否则惩罚力度太大,action model 和ref model产生的action其实分布的差距并不太大import gym impor…

steam发行问题

非常重要,最新steam营销推广 https://store.steampowered.com/news/group/4145017/view/4191238396458987547

软件设计模式概念篇

创建型模式 1、创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。 2、为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不需要清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则。…

mysql中explain命令详解

前言 我们可以使用 explain 命令来查看 SQL 语句的执行计划,从而帮助我们优化慢查询。 使用注意:使用的 mysql 版本为 8.0.28数据准备 CREATE TABLE `tb_product2` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT 商品ID,`name` varchar(20) DEFAULT NULL COMMENT 商品名称,`…

vasp极化计算

为什么我算一个结构,理论上应该是右极化态的,为什么只有离子极化,没有电子极化?是铁电相构建有问题还是计算的数据有问题?

超线程/同步多线程(HT/SMT)技术

超线程/同步多线程(HT/SMT)技术 虽然现在超线程(Hyper-Threading)被大家广泛接受,并把所有一个物理核心上有多个虚拟核心的技术都叫做超线程,但这其实是Intel的一个营销名称。而实际上这一类技术的(学术/技术)通行名称是同步多线程(SMT,Simultaneous Multithreading)…

Linux基础-文件特殊权限

# day13今日安排默写昨日作业讲解文件权限篇综合知识脑图特殊权限(了解)linux提供的12个特殊权限 默认的9位权限 rwx rwx rwx还有三个隐藏的特殊权限,如下 suid 比如 /usr/bin/passwdsgidsbit 特殊权限对照表类别 suid sgid sticky字符表示 S S T出现位置 用户权限位x 用户…