Python:检查文件被锁定
Posted
技术标签:
【中文标题】Python:检查文件被锁定【英文标题】:Python : Check file is locked 【发布时间】:2012-11-14 00:48:57 【问题描述】:我的目标是知道一个文件是否被另一个进程锁定,即使我无权访问该文件!
为了更清楚,假设我使用 python 的内置 open()
和 'wb'
开关(用于写入)打开文件。 open()
将抛出 IOError
和 errno 13 (EACCES)
如果:
-
用户没有文件的权限或
文件被另一个进程锁定
如何在此处检测案例 (2)?
(我的目标平台是Windows)
【问题讨论】:
检查***.com/questions/1861836/… 一旦你确定用户有权限并且你仍然得到异常,那么你就知道情况(2)已经被击中了。 你知道其他进程是如何锁定文件的吗?好像有multiple ways可以做。 假设你得到了这个问题的答案;您打算如何处理这些信息? @KarlKnechtel 向用户报告正确的响应。 【参考方案1】:您可以使用os.access
来检查您的访问权限。如果访问权限好,那一定是第二种情况。
【讨论】:
os.access 似乎是要走的路,但是,在 Windows 上, os.access("myfile", os.R_OK) 为我无权访问的文件返回 True . @Ali - 你是对的。 os.access 不会在 Windows 中返回正确的值。这是 python.org [bugs.python.org/issue2528] 的问题。它还提供了一个补丁,但我不确定应用补丁是否微不足道。 感谢您指出错误。显然使用win32security,很容易在windows中获取文件的ACL权限。【参考方案2】:正如之前的 cmets 中所建议的,os.access
不会返回正确的结果。
但是我在网上找到了另一个可以工作的代码。诀窍是它会尝试重命名文件。
发件人:https://blogs.blumetech.com/blumetechs-tech-blog/2011/05/python-file-locking-in-windows.html
def isFileLocked(filePath):
'''
Checks to see if a file is locked. Performs three checks
1. Checks if the file even exists
2. Attempts to open the file for reading. This will determine if the file has a write lock.
Write locks occur when the file is being edited or copied to, e.g. a file copy destination
3. Attempts to rename the file. If this fails the file is open by some other process for reading. The
file can be read, but not written to or deleted.
@param filePath:
'''
if not (os.path.exists(filePath)):
return False
try:
f = open(filePath, 'r')
f.close()
except IOError:
return True
lockFile = filePath + ".lckchk"
if (os.path.exists(lockFile)):
os.remove(lockFile)
try:
os.rename(filePath, lockFile)
sleep(1)
os.rename(lockFile, filePath)
return False
except WindowsError:
return True
【讨论】:
这是一个有趣的解决方案,但是对于大多数任务来说,睡眠一秒钟太长了 这是对我有用的第一次尝试(有点)。就我而言,我想访问一个 excel 文件。用阅读模式打开它没有帮助。写入模式会创建一个新的空文件,从而损坏文件。附加模式有效!此外,可能更优雅的方法是搜索锁定文件。你是对的:如果是 Windows 中的 Excel,则有一个名为~$excelfilename.xlsx
的隐藏文件。【参考方案3】:
根据the docs:
errno.EACCES
Permission denied
errno.EBUSY
Device or resource busy
那么就这样做吧:
try:
fp = open("file")
except IOError as e:
print e.errno
print e
从那里找出 errno 代码,然后就可以了。
【讨论】:
errno 是相同的,但对于权限拒绝和正在使用的文件。 在fp = open("file")
之后使用fp.close()
我认为它可能更安全。以上是关于Python:检查文件被锁定的主要内容,如果未能解决你的问题,请参考以下文章