时间:2021-05-22
今天有同学问,用os模块的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()基本可用。
到此这篇关于使用Python判断一个文件是否被占用的文章就介绍到这了,更多相关Python判断文件被占用内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
C#中Excel导入时判断是否被占用三种方法Excel导入时判断是否被占用,三种方法:1:Win7可以,WIN10不可以try{//原理,如果文件可以被移动,说
windows10怎么查看端口是否被占用?其实很简单,下面带给大家windows10怎么查看端口是否被占用的方法教程。 1:win+r呼出运行菜单,然后输
有的小伙伴想知道用access()函数可以判断一个文件被占用吗?理论上来说是不行的,access()返回的是文件的读写属性。为了让小伙伴们信服,小编进行了简单的
在Windows系统中,我们准备删除或者移动、更改某文件的时候,如果遇到文件被占用的问题,那么确实很让人头痛,更加头疼的是你根本不知道谁占用了。文件被占用无
在Windows系统中,我们准备删除或者移动、更改某文件的时候,如果遇到文件被占用的问题,那么确实很让人头痛,更加头疼的是你根本不知道谁占用了。文件被占用无