我在Windows中看到了一些关于文件句柄的令人惊讶的行为。
我有两个进程都试图获取同一个底层文件的只读文件句柄。
进程A(Go二进制文件)打开该文件的只读文件句柄,然后使用它来获取文件的独占锁。
进程B(Python二进制文件)然后尝试在相同的文件上打开只读文件句柄,从而产生以下<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<header>
<div id="header">
<a href="http://stackoverflow.com">Stack overflow</a>
</div>
</header>
<main>
</main>
:
IOError
当进程A不存在时,进程B打开文件没有问题。
据我所知,Windows上的两个进程都将只读文件描述符保存到同一个文件中没有问题,而且我没有找到任何文档表明其中一个进程持有一个独占锁会改变
有谁知道导致Python IOError: [Errno 13] Permission denied: 'C:\\path\\to\\file.txt'
调用失败的原因是什么?
(如果它有用,我正在使用的Go文件锁定实现是this one。)
答案 0 :(得分:0)
正如this answer中所建议的那样,open()
如果进程没有访问该文件的权限或者该文件被另一个进程锁定,则会引发IOError
。
要验证它是第二个而不是第一个,您可以使用os.access()
检查进程是否有权访问该文件。
例如:
if not os.access(FILE_PATH, os.R_OK):
print "Failure opening file: No read access for %s" % FILE_PATH
return
try:
fd = open(FILE_PATH)
print "Success opening file"
except IOError:
print "Failure opening file: Another process holds lock on %s" % FILE_PATH
在Unix系统上使用flock
,打开和锁定文件是单独的概念。但是,Windows系统上的LOCK_FILE_EX
实际上会阻止其他进程打开文件的该部分以进行读取或写入访问(source)。