有的小伙伴想知道用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()基本可用。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
白云城资源网 Copyright www.dyhadc.com
暂无“Python用access判断文件是否被占用的实例方法”评论...
更新日志
2024年11月08日
2024年11月08日
- 雨林唱片《赏》新曲+精选集SACD版[ISO][2.3G]
- 罗大佑与OK男女合唱团.1995-再会吧!素兰【音乐工厂】【WAV+CUE】
- 草蜢.1993-宝贝对不起(国)【宝丽金】【WAV+CUE】
- 杨培安.2009-抒·情(EP)【擎天娱乐】【WAV+CUE】
- 周慧敏《EndlessDream》[WAV+CUE]
- 彭芳《纯色角3》2007[WAV+CUE]
- 江志丰2008-今生为你[豪记][WAV+CUE]
- 罗大佑1994《恋曲2000》音乐工厂[WAV+CUE][1G]
- 群星《一首歌一个故事》赵英俊某些作品重唱企划[FLAC分轨][1G]
- 群星《网易云英文歌曲播放量TOP100》[MP3][1G]
- 方大同.2024-梦想家TheDreamer【赋音乐】【FLAC分轨】
- 李慧珍.2007-爱死了【华谊兄弟】【WAV+CUE】
- 王大文.2019-国际太空站【环球】【FLAC分轨】
- 群星《2022超好听的十倍音质网络歌曲(163)》U盘音乐[WAV分轨][1.1G]
- 童丽《啼笑姻缘》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]