有的小伙伴想知道用access()函数可以判断一个文件被占用吗?理论上来说是不行的,access()返回的是文件的读写属性。为了让小伙伴们信服,小编进行了简单的测试。

> import os
> fn = r'D:\temp\csdn\t.py' # 测试用的文件
> os.access(fn, os.F_OK) # 文件是否存在
True
> os.access(fn, os.R_OK) # 文件是否可读
True
> os.access(fn, os.W_OK) # 文件是否可写
True
> os.access(fn, os.X_OK) # 文件是否可执行
True
> fp = open(fn, 'a+') # 以追加写的方式打开文件
> os.access(fn, os.F_OK) # 文件当然还在
True
> os.access(fn, os.R_OK) # 文件依然可读
True
> os.access(fn, os.W_OK) # 文件依然可写
True
> os.access(fn, os.X_OK) # 文件依然执行
True
> fp.close()

可见,os.access()返回的是文件读写属性,与文件是否被占用没有半毛钱关系。

后来,群里有同学建议说,不妨用try尝试着open文件,如果成功,表示文件没有被占用,如果抛出异常,则表示文件被占用。果真如此吗?还是用代码验证一下吧。

> fp1 = open(fn, 'a+')
> fp2 = open(fn, 'a+')
> fp1.close()
> fp2.close()

结果表明,对同一个文件以写的方式打开多次,系统并没有抛出异常。为什么会这样呢?究其原因,是因为文件被打开和文件被占用是完全两个不同的问题。顺便提醒一下,做上面的测试时,不要使用'w'的方式,否则文件内容会被清空。

那么,究竟应该如何用Python判断一个文件是否被占用呢?这个问题还是要回归到操作系统层面来解决,也就是依赖win32api模块。

> import win32file
> def is_used(file_name):
  try:
    vHandle = win32file.CreateFile(file_name, win32file.GENERIC_READ, 0, None, win32file.OPEN_EXISTING, win32file.FILE_ATTRIBUTE_NORMAL, None)
    return int(vHandle) == win32file.INVALID_HANDLE_VALUE
  except:
    return True
  finally:
    try:
      win32file.CloseHandle(vHandle)
    except:
      pass
> fn = r'D:\temp\csdn\t.py'
> is_used(fn)
False
> fp = open(fn, 'a+')
> is_used(fn)
True
> fp.close()
> is_used(fn)
False

简单验证了一下,函数is_used()基本可用。

广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!

稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!

昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。

这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。

而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?