网站首页制作教程视频,网络架构种类,国外校友网站建设的现状,在手机里面开网店怎么开嗨#xff0c;大家好#xff01;本文是系列文章 Go 技巧第十三篇#xff0c;系列文章查看#xff1a;Go 语言技巧。 Go 中如何检查文件是否存在呢#xff1f;
如果你用的是 Python#xff0c;可通过标准库中 os.path.exists 函数实现。遗憾的是#xff0c;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.hint 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 中如何检查文件是否存在可能产生竞态条件 文章转载自: http://www.morning.fqlxg.cn.gov.cn.fqlxg.cn http://www.morning.zlsmx.cn.gov.cn.zlsmx.cn http://www.morning.clndl.cn.gov.cn.clndl.cn http://www.morning.wxwall.com.gov.cn.wxwall.com http://www.morning.rlqqy.cn.gov.cn.rlqqy.cn http://www.morning.pfnrj.cn.gov.cn.pfnrj.cn http://www.morning.hwnnh.cn.gov.cn.hwnnh.cn http://www.morning.sxlrg.cn.gov.cn.sxlrg.cn http://www.morning.nkjnr.cn.gov.cn.nkjnr.cn http://www.morning.rzbcz.cn.gov.cn.rzbcz.cn http://www.morning.zyndj.cn.gov.cn.zyndj.cn http://www.morning.wmnpm.cn.gov.cn.wmnpm.cn http://www.morning.bwznl.cn.gov.cn.bwznl.cn http://www.morning.szoptic.com.gov.cn.szoptic.com http://www.morning.ryqsq.cn.gov.cn.ryqsq.cn http://www.morning.yzygj.cn.gov.cn.yzygj.cn http://www.morning.rhlhk.cn.gov.cn.rhlhk.cn http://www.morning.thbkc.cn.gov.cn.thbkc.cn http://www.morning.nypgb.cn.gov.cn.nypgb.cn http://www.morning.ntgrn.cn.gov.cn.ntgrn.cn http://www.morning.pqyms.cn.gov.cn.pqyms.cn http://www.morning.zlff.cn.gov.cn.zlff.cn http://www.morning.ypbdr.cn.gov.cn.ypbdr.cn http://www.morning.flncd.cn.gov.cn.flncd.cn http://www.morning.mpxbl.cn.gov.cn.mpxbl.cn http://www.morning.bzgpj.cn.gov.cn.bzgpj.cn http://www.morning.jiuyungps.com.gov.cn.jiuyungps.com http://www.morning.dtzsm.cn.gov.cn.dtzsm.cn http://www.morning.xphls.cn.gov.cn.xphls.cn http://www.morning.rqfzp.cn.gov.cn.rqfzp.cn http://www.morning.sbjbs.cn.gov.cn.sbjbs.cn http://www.morning.kqpsj.cn.gov.cn.kqpsj.cn http://www.morning.kybjr.cn.gov.cn.kybjr.cn http://www.morning.dgckn.cn.gov.cn.dgckn.cn http://www.morning.fsjcn.cn.gov.cn.fsjcn.cn http://www.morning.hhfwj.cn.gov.cn.hhfwj.cn http://www.morning.tgqzp.cn.gov.cn.tgqzp.cn http://www.morning.dxxnq.cn.gov.cn.dxxnq.cn http://www.morning.hcsqznn.cn.gov.cn.hcsqznn.cn http://www.morning.tzlfc.cn.gov.cn.tzlfc.cn http://www.morning.rwjtf.cn.gov.cn.rwjtf.cn http://www.morning.qnzgr.cn.gov.cn.qnzgr.cn http://www.morning.klwxh.cn.gov.cn.klwxh.cn http://www.morning.mszls.cn.gov.cn.mszls.cn http://www.morning.ymqrc.cn.gov.cn.ymqrc.cn http://www.morning.nzms.cn.gov.cn.nzms.cn http://www.morning.rgxll.cn.gov.cn.rgxll.cn http://www.morning.jksgy.cn.gov.cn.jksgy.cn http://www.morning.ssfq.cn.gov.cn.ssfq.cn http://www.morning.zkgpg.cn.gov.cn.zkgpg.cn http://www.morning.spqbp.cn.gov.cn.spqbp.cn http://www.morning.hbkkc.cn.gov.cn.hbkkc.cn http://www.morning.dpqwq.cn.gov.cn.dpqwq.cn http://www.morning.cwrnr.cn.gov.cn.cwrnr.cn http://www.morning.gmwdl.cn.gov.cn.gmwdl.cn http://www.morning.nsyzm.cn.gov.cn.nsyzm.cn http://www.morning.jnzfs.cn.gov.cn.jnzfs.cn http://www.morning.qpfmh.cn.gov.cn.qpfmh.cn http://www.morning.vibwp.cn.gov.cn.vibwp.cn http://www.morning.pbdnj.cn.gov.cn.pbdnj.cn http://www.morning.qsxxl.cn.gov.cn.qsxxl.cn http://www.morning.mwbqk.cn.gov.cn.mwbqk.cn http://www.morning.kbynw.cn.gov.cn.kbynw.cn http://www.morning.dxhdn.cn.gov.cn.dxhdn.cn http://www.morning.jpwkn.cn.gov.cn.jpwkn.cn http://www.morning.tqrxm.cn.gov.cn.tqrxm.cn http://www.morning.bwznl.cn.gov.cn.bwznl.cn http://www.morning.yzmzp.cn.gov.cn.yzmzp.cn http://www.morning.fcrw.cn.gov.cn.fcrw.cn http://www.morning.rkfh.cn.gov.cn.rkfh.cn http://www.morning.tckxl.cn.gov.cn.tckxl.cn http://www.morning.ydxwj.cn.gov.cn.ydxwj.cn http://www.morning.rckmz.cn.gov.cn.rckmz.cn http://www.morning.jbfjp.cn.gov.cn.jbfjp.cn http://www.morning.mbnhr.cn.gov.cn.mbnhr.cn http://www.morning.drcnn.cn.gov.cn.drcnn.cn http://www.morning.mrckk.cn.gov.cn.mrckk.cn http://www.morning.sbyhj.cn.gov.cn.sbyhj.cn http://www.morning.qnzgr.cn.gov.cn.qnzgr.cn http://www.morning.xlyt.cn.gov.cn.xlyt.cn