如何用Python判断一个文件是否被占用?Python测试方法

今天有同学问,可以用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()返回的是文件的读写属性,与文件是否被占用无关。

后来,群里的一个同学建议你不妨试试打开文件。如果成功易语言文件夹是否存在,则说明文件未被占用。如果抛出异常,则表示文件被占用。真的吗?让我们用代码验证一下。

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

图片[1]-如何用Python判断一个文件是否被占用?Python测试方法-老王博客

结果表明,多次打开同一个文件写入时,系统没有抛出异常。为什么会这样?原因是因为打开的文件和被占用的文件是两个完全不同的问题。对了,在做上述测试的时候,不要使用’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()基本可用。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论