Go 中如何检查文件是否存在?可能产生竞态条件?
嗨,大家好!本文是系列文章 Go 技巧第十三篇,系列文章查看:Go 语言技巧。
Go 中如何检查文件是否存在呢?
如果你用的是 Python,可通过标准库中 os.path.exists
函数实现。遗憾的是,Go 标准库没有提供这样直接的函数,好在,没有直接的,却有不那么直接的。
本文将基于这个话题展开,介绍 Go 中如何检查文件是否存在。
另外,本文最后还会介绍一个小注意点,即在判断文件是否存在时,如何避免中潜在的竞态条件。
os.Stat
检查文件状态
Go 标准库虽然没有提供类似于 os.Exist
这样直接的函数检查文件是否存在,但它提供另外一个函数 os.Stat
。
os.Stat
函数的作用是获取文件状态信息,我们通过检查它返回的错误即可知晓文件是否存在。
示例代码,如下所示:
func main() {_, err := os.Stat("/path/to/file")if err != nil {if os.IsNotExist(err) {// 文件不存在} else {// 其他错误}}// 文件存在
}
第一个返回值表示文件信息,不是我们关心的重点,直接省略掉。
第二个返回值表示错误 error
。如果文件不存在,可通过检查 os.IsNotExist
检查 error
是否是 os.ErrNotExist
,确定文件是否存在。
与 C 对比
上面的示例中,我们使用 os.Stat
函数获取文件的状态,通过 errors.Is
判断返回错误,如果是 os.ErrNotExist
,则文件不存在。
不得不说,这其实更底层更标准的做法。
类似于 Python 等高级语言,提供 os.path.exist
主要是为了方便编程,提高效率。
如果使用 Unix C 实现同样的功能,示例代码如下:
#include <errno.h>
#include <stdio.h>
#include <sys/stat.h>int main() {struct stat buffer;int exist = stat("/path/to/file", &buffer);if (exist != 0) {if (errno == ENOENT) { /* 文件不存在*/ } else { /* 其他错误 */ }return 0;}// 文件存在return 0;
}
是不是和我们前面代码基本是一个模子。
Go1.13 以及之后推荐使用 errors.Is
自 Go 1.13 起,推荐使用 os.Stat
和 errors.Is
的组合。这种方法提供了更一致和灵活的错误处理方式。
具体而言,即使是经过包裹的错误,errors.Is
依然能够识别。
我期初认为,os.IsNotExist
能识别包裹 error
,但不太确定,于是写了个代码简单测试了下。
示例代码,如下所示:
_, err := os.Stat("/path/to/file") // 这是一个不存在的文件路径
werr := fmt.Errorf("Main: %w", err) // 包裹生成新错误
fmt.Println(os.IsNotExist(err)) // 返回 true,表示不存在,这是错误结果
fmt.Println(os.IsNotExist(werr)) // 返回 false,表示存在
fmt.Println(errors.Is(werr, os.ErrNotExist)) // 返回 true 表示不存在
测试结果都已写在注释中。
如上可知, os.IsNotExist
只能识别最初的 error
,如果错误经过 fmt.Errorf
包裹,则必须使用 errors.Is
识别。
一句话概括,os.IsNotExist
可以用,但有适用范围,而 errors.Is
则更通用。
这一般也同样适用于其他类似的库。
直接使用 Open 避免竞态条件
到这里,基本已经解答了 Go 中如何检查文件存在性的问题。
但,我还想引入一个讨论:并发场景下,如何避免检查文件存在性时引入潜在的竞态条件?
简言之,文件状态可能在检查和操作发生变化。
什么是更好的做法呢?
我们可以直接尝试打开或操作文件,根据返回结果判断错误。
示例代码如下:
file, err := os.Open("/path/to/file")
if err != nil {if errors.Is(err, os.ErrNotExist) {// 文件不存在} else {// 处理其他类型的错误}
}
如上代码中,你通过 open
直接打开一个文件,如果文件不存在,os.Open
将返回一个错误,我们检查 error 确定下一步的操作。
通过这种方式,我们可以避免打开文件时引入竞态条件。
open 是原子操作?
读到这里,可能有人不禁问,为什么 open 能避免竞态条件呢?它是原子操作吗?
是的。
系统调用都是原子操作,操作系统会保证操作过程不受到干扰。如果出现问题,也会进行回滚操作.
这一点对于 Open 同样使用。
当我们使用 open 打开一个文件时,系统会确保在这个操作完成前,不会受其他操作干扰,包括如检查文件是否存在、创建文件描述符、分配必要的资源等。
结论
本文通过一个小小的问题:Go 语言中如何检查文件是否存在,除了引出 Go 中检查文件是否存在的基本方法。同时,还介绍了文件操作时如何避免潜在的竞态条件,进一步了解到一个有趣的小知识,Unix 系统调用是原子性操作。
最后,还是希望本文能帮助各位在 GO 语言的学习道路上起到一点微末作用。
博客地址:Go 中如何检查文件是否存在?可能产生竞态条件?
相关文章:

Go 中如何检查文件是否存在?可能产生竞态条件?
嗨,大家好!本文是系列文章 Go 技巧第十三篇,系列文章查看:Go 语言技巧。 Go 中如何检查文件是否存在呢? 如果你用的是 Python,可通过标准库中 os.path.exists 函数实现。遗憾的是,Go 标准库没有…...

红日靶场1搭建渗透
环境搭建 下载好镜像文件并解压,启动vmware 这里我用自己的win7 sp1虚拟机作为攻击机,设置为双网卡NAT,vm2 其中用ipconfig查看攻击机ip地址 设置win7 x64为双网卡,vm1,vm2 设置win08单网卡vm1,win2k3为单…...

ChatGPT之搭建API代理服务
简介 一行Docker命令部署的 OpenAI/GPT API代理,支持SSE流式返回、腾讯云函数 。 项目地址:https://github.com/easychen/openai-api-proxy 这个项目可以自行搭建 OpenAI API 代理服务器工具,该项目是代理的服务器端,不是客户端。…...
Kotlin手记(一):基础大杂烩
Kotlin简介 2011年7月,JetBrains推出Kotlin项目,这是一个面向JVM的新语言 2012年2月,JetBrains以Apache 2许可证开源此项目。 2016年2月15日,Kotlin v1.0发布,这被认为是第一个官方稳定版本。 在Google I/O 2017中&am…...

redis源码之:集群创建与节点通信(2)
在上一篇redis源码之:集群创建与节点通信(1)我们可知,在集群中,cluster节点之间,通过meet将对方加入到本方的cluster->nodes列表中,并在后续过程中,不断通过clusterSendPing发送p…...
2024.2.5 寒假训练记录(19)
文章目录 牛客 寒假集训2A Tokitsukaze and Bracelet牛客 寒假集训2B Tokitsukaze and Cats牛客 寒假集训2D Tokitsukaze and Slash Draw牛客 寒假集训2E Tokitsukaze and Eliminate (easy)牛客 寒假集训2F Tokitsukaze and Eliminate (hard)牛客 寒假集训2I Tokitsukaze and S…...

游戏服务器租赁多少钱一台?26元,服不服?
游戏服务器租用多少钱一年?1个月游戏服务器费用多少?阿里云游戏服务器26元1个月、腾讯云游戏服务器32元,游戏服务器配置从4核16G、4核32G、8核32G、16核64G等配置可选,可以选择轻量应用服务器和云服务器,阿腾云atengyu…...
wpf 引入本项目的图片以及引入其他项目的图像资源区别及使用方法
在WPF项目中引入本项目的图片和引入其他项目的图像资源,两者的主要区别在于资源的位置以及如何通过URI引用它们。以下是详细说明及使用方法: 一、引入本项目的图片资源: 将图片文件(如PNG, JPG等)放入你的WPF项目…...
jsp页面,让alert弹出信息换行显示
第一种方式:后端拼接上换行符前端显示 1,java后端将信息封装成字符串时,在需要换行的地方拼接上一个换行符, 显示在HTML中的换行,通常需要用<br>标签替代\n,如下: String javaString &…...

【IC设计】Windows下基于IDEA的Chisel环境安装教程(图文并茂)
Chisel环境安装教程 第一步 安装jdk,配置环境变量第二步 安装sbt,不用配置环境变量第三步 安装idea社区版第四步 离线安装scala的idea插件第五步 配置sbt换源1.切换目录2.创建repositories文件3.配置sbtconfig.txt文件 第六步 使用chisel-tutorial工程运…...

IF=82.9!高分文献解读|吉西他滨联合顺铂化疗激活肿瘤免疫新机制
鼻咽癌(nasopharyngeal carcinoma, NPC)是一种发生于鼻咽部上皮细胞的恶性肿瘤,且高发于中国。吉西他滨联合顺铂(GP)化疗作为鼻咽癌的一种全球标准治疗方案,然而治疗的具体机制目前尚不清楚。中山大学肿瘤防…...
【QT+QGIS跨平台编译】之二十八:【Protobuf+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
文章目录 一、Protobuf介绍二、文件下载三、文件分析四、pro文件4.1 libprotobuf4.2 libprotobuf-lite4.3 libprotoc4.4 protocApp五、编译实践一、Protobuf介绍 Protocol Buffers(简称 Protobuf)是由 Google 开发的一种数据序列化协议,就像 XML 或 JSON 一样,但是它更小、…...
代码解析:list.stream().filter(Objects::nonNull).collect(Collectors.toList())
这段Java代码是使用了Java 8引入的流(Stream) API来处理集合(比如List)。这个特定的例子展示了如何从一个列表中过滤掉所有的null值,并返回一个新的列表,其中不包含任何null元素。下面是对这段代码的逐步解析: 代码解…...

代驾应用系统(ssm)
登录首页 管理员界面 代驾司机界面 普通用户界面 前台页面 1、系统说明 (1) 框架:spring、springmvc、mybatis、mysql、jsp (2) 系统分为前台系统、后端管理系统 2、欢迎留言联系交流学习讨论:qq 97820625…...
技术栈面试综合整理
Git命令详解 设计模式看了又忘,忘了又看 Linux命令 Java集合Map Java基础 JVM面试题 JVM原理最全、清晰、通俗讲解,五天40小时吐血整理_小爷欣欣-CSDN博客_jvm原理 IO 计算机网络 计算机网络2 jsp 多线程 多线程2 大厂 JAVA 高频面试题 Ja…...
Java中的static关键字
静态变量(类变量)、静态方法(类方法):static声明的属性与方法。 静态变量/静态方法生命周期和类相同,在整个程序执行期间都有效。它有如下特点: 为该类的公用变量,属于类࿰…...
SpringBoot日志插件log4J和slf4J的使用和比较含完整示例
点击下载《SpringBoot日志插件log4J和slf4J的使用和比较含完整示例》 1. 前言 本文主要介绍了在 Spring Boot 框架中如何使用 Log4j 和 Slf4j,并通过对比分析它们的优缺点,帮助读者更好地选择合适的日志记录工具。文章中提供了完整的示例代码ÿ…...

我的世界Java版服务器如何搭建并实现与好友远程联机Minecarft教程
文章目录 1. 安装JAVA2. MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7. 配置公网访问地址8.远程联机测试9. 配置固定远程联机端口地址9.1 保留一个固定tcp地址9.2 配置固定公网TCP地址9.3 使用固定公网地址远程联机 本教程主要介…...

如何进行游戏服务器的负载均衡和扩展性设计?
在进行游戏服务器的负载均衡和扩展性设计时,需要考虑多个方面,以确保服务器的稳定性和可扩展性。以下是一些关键的步骤和考虑因素: 负载均衡的需求分析 在进行负载均衡设计之前,需要深入了解游戏服务器的负载特性和需求。这包括…...

机器学习数学基础
机器学习基础 1、标量、向量、矩阵、张量2、概率函数、概率分布、概率密度、分布函数3、向量的线性相关性4、最大似然估计5、正态分布(高斯分布)6、向量的外积(叉积)7、向量的内积(点积)8、超平面(Hyperplane)9、广义线性模型(GLM)10、伯努利分布与二项分布11、凸函数…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑
精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑 在电子商务领域,转化率与网站性能是决定商业成败的核心指标。今天,我们将深入解析不同类型电商平台的转化率基准,探讨页面加载速度对用户行为的…...
python读取SQLite表个并生成pdf文件
代码用于创建含50列的SQLite数据库并插入500行随机浮点数据,随后读取数据,通过ReportLab生成横向PDF表格,包含格式化(两位小数)及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...