zoukankan      html  css  js  c++  java
  • golang判断文件是否存在

    判断一个文件是否存在是一个相当常见的需求,在golang中也有多种方案实现这一功能。

    现在我们介绍其中两种最常用也是最简单的实现,第一种将是跨平台通用的,而第二种则在POSIX平台上通用。

    跨平台实现

    跨平台实现的思路很简单,如果某个文件不存在,那么使用os.Lstat就一定会返回error,只要判断error是否代表文件不存在即可。

    也许你注意到了有些代码会使用os.Open来完成上述工作,不过最好不要这么做,因为虽然两者完成的功能没有区别,但open和stat的调用开销是不同的,后者要小于前者,而且对于判断文件是否存在,检查它的元数据要比直接尝试打开它更加合理。

    那么来看看实现的代码:

    func FileExist(path string) bool {
      _, err := os.Lstat(path)
      return !os.IsNotExist(err)
    }
    

    代码很简单,对于Windows/Linux/MacOS等是通用的,一般没有特殊需求我也比较推荐这种实现。

    POSIX平台实现

    如果你的程序是面向POSIX平台的(例如UNIX、Linux等),那么还有一种更简单的方案——syscall.Access

    syscall.Access提供了用户检查文件元信息的手段,通常它被用来检查文件权限以及文件的存在性。

    通过使用syscall.F_OK标志检查文件,如果不存在则会返回和os.Lstat一样的error:

    func FileExist(path string) bool {
      err := syscall.Access(path, syscall.F_OK)
      return !os.IsNotExist(err)
    }
    

    这种实现的最大优势在于它简单而直观,但是它无法在Windows上使用。

    一点提示

    当我们的FileExist返回true时,其实文件并不一定存在。

    当我们对目标path中的某一部分没有可读权限时,os.Lstatsyscall.Access同样会返回error,不过这个error不会让os.IsNotExist返回true。

    当文件不存在而你对文件所在的目录或者它的上层目录没有访问权限时,FileExist依旧会返回true,bug就在这时发生了。

    所以重要的一点是在判断文件是否存在前应该先判断自己对文件及其路径是否有访问权限

  • 相关阅读:
    装饰器模块和面试题
    装饰器和推导式
    设计商城系统,主要提供两个功能:商品管理、会员管理。
    写代码:三级菜单
    写代码:循环打印names列表,把元素和索引值都打印出来。
    写代码: 编写登录接口
    写代码:假设一年期定期利率为3.25%,计算一下需要过多少年,一万元的一年定期存款连本带息能翻番?
    写代码:输入一年份,判断该年份是否是闰年并输出结果。
    写代码:制作趣味模板程序
    变量n1和n2是什么关系
  • 原文地址:https://www.cnblogs.com/apocelipes/p/10199618.html
Copyright © 2011-2022 走看看