Golang 文件操作
读取
- 一次性读取
data, err := os.ReadFile("filename.txt")
if err != nil {log.Fatal(err)
}
fmt.Println(string(data))
- 按行读取
方式1:bufio.NewScanner
file, err := os.Open("filename.txt")
if err != nil {panic(err)
}
defer file.Close()scanner := bufio.NewScanner(file)
for scanner.Scan() {fmt.Println(scanner.Text())
}if err := scanner.Err(); err != nil {log.Fatal(err)
}
方式2:bufio.NewReader
file, err := os.Open("filename.txt")
if err != nil {panic(err)
}
defer file.Close()reader:= bufio.NewReader(file)
for {line, _, err := reader.ReadLine()if err == io.EOF {break}fmt.Println(string(line))
}
区别是bufio.NewScanner
还可自定义扫描的分隔符,如:
file, _ := os.Open("filename.txt")
scanner := bufio.NewScanner(file)
//scanner.Split(bufio.ScanLines) // 按行读,是默认读取方式
//scanner.Split(bufio.ScanWords) // 按单词读,返回文本中每个以空格分隔的单词,并删除周围的空格
//scanner.Split(bufio.ScanBytes) // 按字节读
//scanner.Split(bufio.ScanRunes) // 按 UTF-8 编码的字符读,如:中文字符for scanner.Scan() {println(scanner.Text())
}
- 按指定字节长度读取
可以使用bufio.NewReader
的Read
方法,能读取指定长度的字节到一个切片中
package mainimport ("bufio""fmt""os"
)func main() {file, err := os.Open("filename.txt")if err != nil {fmt.Println(err)return}defer file.Close()reader := bufio.NewReader(file)buf := make([]byte, 2) // 指定读取的字节长度n, err := reader.Read(buf)if err != nil {return}fmt.Printf("读取的字节数: %d\n", n)fmt.Printf("读取的内容: %s\n", buf[:n])
}
假如要读取的文件中只有内容hello
,那么将输出:
读取的字节数: 2
读取的内容: he
然后在此基础上,使用循环来读整个文件
package mainimport ("bufio""fmt""os"
)func main() {file, err := os.Open("filename.txt")if err != nil {fmt.Println(err)return}defer file.Close()reader := bufio.NewReader(file)buf := make([]byte, 2) // 指定读取的字节长度for {n, err := reader.Read(buf)if err != nil {break}fmt.Printf("%s\n", buf[:n])}
}
其输出将变为:
he
ll
o
写入
- 权限表示
在 Unix 和类 Unix 系统的权限表示中,用3个数字表示,三个数字各代表了不同用户类别的访问权限:
- 第一个数字:代表文件拥有者(owner)的权限。
- 第二个数字:代表与文件拥有者同组的用户(group)的权限。
- 第三个数字:代表其他所有用户(others)的权限。
每个数字可以是0到7之间的任意数字,分别控制读(4)、写(2)和执行(1)权限的开启和关闭。这些数字是对应的权限值的总和
- 0 没有权限
- 1 执行权限
- 2 写权限
- 4 读权限
一个权限表示是:0666,那么它其实是代表可读可写,前面的 0 是用来明确表示这是一个八进制数
- 操作标志
// Flags to OpenFile wrapping those of the underlying system. Not all
// flags may be implemented on a given system.
const (// Exactly one of O_RDONLY, O_WRONLY, or O_RDWR must be specified.O_RDONLY int = syscall.O_RDONLY // open the file read-only.O_WRONLY int = syscall.O_WRONLY // open the file write-only.O_RDWR int = syscall.O_RDWR // open the file read-write.// The remaining values may be or'ed in to control behavior.O_APPEND int = syscall.O_APPEND // append data to the file when writing.O_CREATE int = syscall.O_CREAT // create a new file if none exists.O_EXCL int = syscall.O_EXCL // used with O_CREATE, file must not exist.O_SYNC int = syscall.O_SYNC // open for synchronous I/O.O_TRUNC int = syscall.O_TRUNC // truncate regular writable file when opened.
)
举几个例子:
os.O_CREATE|os.O_WRONLY // 不存在则创建,若存在则从头写入并覆盖原位置的内容,比如原先是hello,然后写入的是demo,那么会变成demoo
os.O_CREATE|os.O_TRUNC|os.O_WRONLY // 不存在则创建,存在则清空
os.O_APPEND|os.O_WRONLY // 追加写
常用方法:
os.OpenFile(name string, flag int, perm FileMode) (*File, error)
os.WriteFile(name string, data []byte, perm FileMode) error // 存在则清空后以原权限写入,不存在则以指定权限创建
os.Open(name string) (*File, error) //模式为 O_RDONLY
os.Create(name string) (*File, error) //Create 创建或清空,模式为 O_RDWR
os.Remove(name string) error //将指定的文件或目录删除
os.RemoveAll(path string) error //删除路径及其包含的任何子项
文件复制
io.Copy(dst Writer, src Reader) (written int64, err error)
package mainimport ("io""os"
)// CopyFile copies a file from src to dst. If src and dst files exist, and are the same, then return error.
// If dst does not exist, it is created with mode 0666 (before umask).
func CopyFile(src, dst string) error {in, err := os.Open(src)if err != nil {return err}defer in.Close()out, err := os.Create(dst)if err != nil {return err}defer out.Close()_, err = io.Copy(out, in)if err != nil {return err}return out.Sync()
}func main() {src := "source.txt"dst := "destination.txt"if err := CopyFile(src, dst); err != nil {panic(err)}
}
操作目录
- 创建目录
package mainimport ("fmt""os"
)func main() {// 创建一个目录err := os.Mkdir("example_dir", 0755)if err != nil {fmt.Println(err)}// 创建目录路径中所有不存在的目录err = os.MkdirAll("example_dir/subdir", 0755)if err != nil {fmt.Println(err)}
}
- 读取目录
os.ReadDir(name string) ([]DirEntry, error) // go 1.16 引入
读取指定目录下的文件和文件夹,及其大小
package mainimport ("fmt""os"
)// convertSize 将字节大小转换为更可读的单位
func convertSize(size int64) string {const (KB = 1 << 10 // 1024MB = 1 << 20 // 1024 * 1024GB = 1 << 30 // 1024 * 1024 * 1024)switch {case size >= GB:return fmt.Sprintf("%.2f GB", float64(size)/GB)case size >= MB:return fmt.Sprintf("%.2f MB", float64(size)/MB)case size >= KB:return fmt.Sprintf("%.2f KB", float64(size)/KB)default:return fmt.Sprintf("%d B", size)}
}func main() {entries, err := os.ReadDir(".") // 读取当前目录if err != nil {fmt.Println(err)return}for _, entry := range entries {info, err := entry.Info()if err != nil {// 如果无法获取文件信息,则跳过该文件fmt.Println("Error:", err)continue}fmt.Printf("%s: %s\n", info.Name(), convertSize(info.Size()))}
}
如果想读取子目录中的内容,可以添加一个循环,然后判断是否是目录,然后同样取即可,直至没有子目录
或者使用更高效的filepath.WalkDir
(go 1.16),是filepath.Walk
(go 1.0)的优化版,性能更好
package mainimport ("fmt""os""path/filepath"
)// convertSize 将字节大小转换为更可读的单位
func convertSize(size int64) string {const (KB = 1 << 10 // 1024MB = 1 << 20 // 1024 * 1024GB = 1 << 30 // 1024 * 1024 * 1024)switch {case size >= GB:return fmt.Sprintf("%.2f GB", float64(size)/GB)case size >= MB:return fmt.Sprintf("%.2f MB", float64(size)/MB)case size >= KB:return fmt.Sprintf("%.2f KB", float64(size)/KB)default:return fmt.Sprintf("%d B", size)}
}func visitFile(path string, d os.DirEntry, err error) error {if err != nil {fmt.Printf("访问文件时遇到错误: %v\n", err)return nil // 返回nil继续遍历}if !d.IsDir() {info, err := d.Info()if err != nil {fmt.Printf("获取文件信息时遇到错误: %v\n", err)return nil}fmt.Printf("%s: %s\n", path, convertSize(info.Size()))}return nil
}func main() {err := filepath.WalkDir(".", visitFile)if err != nil {fmt.Printf("遍历目录时遇到错误: %v\n", err)}
}
相关文章:
Golang 文件操作
读取 一次性读取 data, err : os.ReadFile("filename.txt") if err ! nil {log.Fatal(err) } fmt.Println(string(data))按行读取 方式1:bufio.NewScanner file, err : os.Open("filename.txt") if err ! nil {panic(err) } defer file.Clo…...
C++I/O流——(3)文件输入/输出(第二节)
归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言📝 含泪播种的人一定能含笑收获ÿ…...
内网穿透[让你在家里也能榨干学校的服务器]Yep!
内网穿透 问题:什么是内网穿透,内网穿透的作用是什么? 前提!!!!你得拥有超级管理员的权限,比如root,不然后面的一切免提! 应用场景如下:比如你…...
构建基于RHEL9系列(CentOS9,AlmaLinux9,RockyLinux9等)的支持63个常见模块的PHP8.1.20的RPM包
本文适用:rhel9系列,或同类系统(CentOS9,AlmaLinux9,RockyLinux9等) 文档形成时期:2023年 因系统版本不同,构建部署应略有差异,但本文未做细分,对稍有经验者应不存在明显障碍。 因软件世界之复杂和个人能力…...
你知道什么是Java中的类型强转吗?
强制类型转换 强转存在与父转子的时候,子转父不需要进行强转,如 Object o "hello"; //String类是Object类的子类,无需进行强转类型强转分为两种情况: Ⅰ、向下转型:将父类对象引用转换为子类对象引用&am…...
【2023】ArrayList和LinkedList详解介绍对比
一、ArrayList 1、概述 ArrayList是实现了List接口的动态数组,所谓动态数组就是他的大小是可变的。实现了所有可选列表操作,并允许包括Null在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。 …...
【软件工程】基于领域建模的产品与技术方案设计(领域驱动设计DDD)
文章目录 1、领域建模2、产品方案、技术方案3、领域驱动设计DDD 1、领域建模 领域模型(domain model) 是对领域内的概念类或现实世界中对象的可视化表示。领域模型也成为概念模型、领域对象模型和分析对象模型。域模型是一种概念模型,也叫问题域模型。它表述的是某…...
跨境电商账号频繁?你的IP可能“不干净”了
疫情促进了跨境电商行业的加速发展,许多卖家也抓住了这波流量红利,跨境电商月入数万,数十万甚至数百万的造福神话也不断在上演,但由于国内外电商运营模式不同,多店运营、用户数据收集、刷单等行为都受到了国外平台的严…...
Docker数据卷与拦截与目录拦截
目录 高级容器挂载技术深度解析引言数据卷挂载原理解析应用场景使用介绍 目录挂载原理解析应用场景使用介绍 总结 高级容器挂载技术深度解析 引言 容器技术的快速发展使得容器挂载技术变得愈发重要。在容器化应用中,数据卷挂载和目录挂载是两种常见的挂载方式&…...
Python 元类 metaclass 详解
元类(metaclass)是 Python 中一个高级且相对较少使用的概念。元类可以被视为类的类,它控制类的创建过程。 一、基本概念 在 Python 中,一切皆对象。为了避免混淆,我们约定两个术语: 类实例:当…...
HCIA基础知识
IP地址、静态路由、动态路由、交换机 OSPF RIP DHCP VLAN ACL NAT OSI TCP/IP UDP TCP 三次握手,四次挥手,报头 什么是网络? 由网络连接设备通过传输介质将网络终端设备连接起来,进行资源共享、信息传递的平台。 OSI七…...
翻译: Streamlit从入门到精通 部署一个机器学习应用程序 四
Streamlit从入门到精通 系列: 翻译: Streamlit从入门到精通 基础控件 一翻译: Streamlit从入门到精通 显示图表Graphs 地图Map 主题Themes 二翻译: Streamlit从入门到精通 构建一个机器学习应用程序 三 1. 5. 如何部署一个Streamlit应用 部署是将应用程序从开发…...
AI时代Python量化交易实战:ChatGPT引领新时代
文章目录 《AI时代Python量化交易实战:ChatGPT让量化交易插上翅膀》关键点内容简介作者简介购买链接 《AI时代架构师修炼之道:ChatGPT让架构师插上翅膀》关键点内容简介作者简介 赠书活动 《AI时代Python量化交易实战:ChatGPT让量化交易插上翅…...
国科大软件安全原理期末复习笔记
1 软件安全总论 1.软件的三大特性:复杂性、互连性、可扩展性; 2.基本概念:缺陷、漏洞、风险 缺陷(bug):软件在设计和实现上的错误;漏洞(vulnerability):漏洞…...
人工智能软件测试2024年主要趋势
人工智能软件测试领域在未来可能面临多个发展趋势,其中一些趋势可能会对测试方法、工具和流程产生深远的影响。以下是塑造人工智能软件测试未来的主要趋势: 自动化和自动学习测试:随着人工智能的发展,测试自动化将变得更加智能和自…...
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
🍎个人博客:个人主页 🏆个人专栏:JAVA ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 懒汉式(Lazy Initialization): 双重检查锁定(Double-Checked Locking)…...
常见的反爬虫风控 | 验证码风控
一.前言 在当今信息技术迅速发展的背景下,网站和在线服务面临着日益增长的自动化访问威胁,这些大多来自于各类爬虫程序。这种大量的自动化访问不仅对网站的正常运行构成压力,还可能导致敏感数据的泄露,甚至被用于不正当竞争和恶意…...
ClickHouse(21)ClickHouse集成Kafka表引擎详细解析
文章目录 Kafka表集成引擎配置Kerberos 支持 虚拟列 资料分享参考文章 Kafka表集成引擎 此引擎与Apache Kafka结合使用。 Kafka 特性: 发布或者订阅数据流。容错存储机制。处理流数据。 老版Kafka集成表引擎参数格式: Kafka(kafka_broker_list, kaf…...
JSP-概念
一、引子 很多读者可能听过JSP,并且知道这是一门过时的技术了。在Spring,SpringBoot已经成为主流的今天,笔者为什么还要介绍JSP的相关内容呢?笔者常常提到一个概念:理解一门技术,要理解这个技术为什么产生…...
sqlite插入语句id自增列问题
sqlite给主键id设置AUTOINCREMENT自增在插入数据的时候报错table has x columns but x-1 values were supplied 为什么自增列要显示不提供,sqlite需要提供自增列table ResTools has 7 columns but 6 values were supplied SQL Statement:insert into ResTools values(管理系统w…...
C#,字符串匹配(模式搜索)AC(Aho Corasick)算法的源代码
Aho-Corasick算法简称AC算法,也称为AC自动机(Aho-Corasick)算法,1975年产生于贝尔实验室(The Bell Labs),是一种用于解决多模式字符串匹配的经典算法之一。 the Bell Lab 本文的运行效果: AC算法以模式树…...
【网络取证篇】Windows终端无法使用ping命令解决方法
【网络取证篇】Windows终端无法使用ping命令解决方法 以Ping命令为例,最近遇到ping命令无法使用的情况,很多情况都是操作系统"环境变量"被改变或没有正确配置导致—【蘇小沐】 目录 1、实验环境(一)无法ping命令 &a…...
electron+vue网页直接播放RTSP视频流?
目前大部分摄像头都支持RTSP协议,但是在浏览器限制,最新版的浏览器都不能直接播放RTSP协议,Electron 桌面应用是基于 Chromium 内核的,所以也不能直接播放RTSP,但是我们又有这个需求怎么办呢? 市场上的方案…...
【Delphi 基础知识 19】Assigned的用法
在Delphi中,Assigned 是一个用于检查指针是否已分配内存的函数。它通常用于检查对象或指针是否已经被分配内存,以避免在未分配内存的情况下引用或操作它。 以下是 Assigned 的一些用法示例: 检查对象是否已分配内存: varMyObject…...
多线程在编程中的重要性有什么?并以LabVIEW为例进行说明
多线程在编程中的重要性体现在以下几个方面: 并行处理: 多线程允许程序同时执行多个任务,这在现代多核心处理器上尤其重要。通过并行处理,可以显著提高程序的执行效率和响应速度。 资源利用最大化: 通过多线程&#x…...
K8S---kubectl top
一、简介 该命令类似于linux–top命令,用于显示node和pod的CPU和内存使用情况 二、命令行 1、help命令 k top --help Display resource (CPU/memory) usage. The top command allows you to see the resource consumption for nodes or pods. This command requires Metri…...
Linux部署前后端项目
部署SpringBoot项目 创建SpringBoot项目 先确保有一个可以运行的springboot项目,这里就记录创建项目的流程了,可以自行百度。 命令行启动 2.1、在linux中,我是在data目录下新创建的一个project目录(此目录创建位置不限制&…...
一文搞懂系列——Linux C线程池技术
背景 最近在走读诊断项目代码时,发现其用到了线程池技术,感觉耳目一新。以前基本只是听过线程池,但是并没有实际应用。对它有一丝的好奇,于是趁这个机会深入了解一下线程池的实现原理。 线程池的优点 线程池出现的背景…...
stable diffusion代码学习笔记
前言:本文没有太多公式推理,只有一些简单的公式,以及公式和代码的对应关系。本文仅做个人学习笔记,如有理解错误的地方,请指出。 本文包含stable diffusion入门文献和不同版本的代码。 文献资源 本文学习的代码&…...
腾讯云服务器怎么买?两种购买方式更省钱
腾讯云服务器购买流程很简单,有两种购买方式,直接在官方活动上购买比较划算,在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵,但是自定义购买云服务器CPU内存带宽配置选择范围广,活动上购买只能选择固定的活动…...
好用的免费建站网站/企业网络营销顾问
前言 俗话说“生于忧患,死于安乐”,其实大部分中年危机,就是在安乐中产生的。 有的人或许会反驳,“照你这么说,我还必须奋斗了,不奋斗就要死,难道选择安逸的生活就不对吗?我就没有…...
安全联盟这种网站建设/列举五种网络营销模式
1、申请方式 (1)栈(stack):由系统自动分配。 (2)堆(heap):需程序员自己申请(C:调用malloc,realloc,calloc申请…...
网站如何做提交的报名表/提高工作效率的方法有哪些
如何升级python的包、如何升级python包的版本 pip install --upgrade input 如何升级python对应版本的包 pip install --upgrade input0.0.0...
盐城网站建设报价/seo岗位培训
FPGA入门嵌入式块RAM使用为FIOF(First In First Out) 单时钟FIOF、双时钟FIOF(普通双时钟和混合宽度双时钟) 由于单时钟FIOF只有一个时钟信号,所以可以在FPGA内部中使用单时钟FIOF用以其他模块数据的缓存。FPGA中从传感器模块读取…...
企业做门户网站的重要性/企业推广app
/* PID的参数设置可以参照以下来进行: 参数整定找最佳,从小到大顺序查; 先是比例后积分,最后再把微分加; 曲线振荡很频繁,比例度盘要放大; 曲线漂浮绕大湾,比例度盘往小扳; 曲线偏离回复慢,积分时…...
介绍网页设计/seo网络排名优化哪家好
通过前面四天,我们其实已经基本实现了docker的最核心的功能,后面几天,我将带大家实现一些docker的其他命令,今天我们主要是来实现一下 docker logs 功能,也就是查看docker内部日志 写日志 说下总体思路,这个…...