os.path.exists()
只是调用C库的stat()
函数。
我相信您正在内核NFS实现中的高速缓存中运行。以下是指向该页面的链接,该页面描述了该问题以及一些刷新缓存的方法。
?您有一个打开的文件,需要检查该文件是否已被较新的文件替换。您必须先刷新父目录的文件句柄缓存,然后stat()返回新文件的信息,而不返回打开文件的信息。
?实际上,这种情况还存在另一个问题:旧文件可能已被删除,并被新文件替换,但是两个文件可能具有相同的inode。您可以通过刷新打开文件的属性高速缓存,然后查看fstat()是否因ESTALE失败而检查这种情况。
?您需要检查文件是否存在。例如一个锁定文件。内核可能已缓存该文件不存在,即使实际上确实存在。您必须刷新父目录的负文件句柄缓存,以查看该文件是否确实存在。
?如果父目录的mtime更改,则通过刷新其属性缓存来刷新文件句柄缓存。如果NFS服务器支持纳秒或微秒的分辨率,则此方法应该可以很好地工作。
?Linux:将目录chown()分配给当前所有者。如果调用成功返回,则刷新文件句柄缓存。
?Solaris 9、10:唯一方法是尝试使用rmdir()父目录。ENOTEMPTY表示已刷新缓存。尝试rmdir()当前目录失败,并显示EINVAL,并且不刷新缓存。
?FreeBSD 6.2:唯一方法是尝试使用rmdir()父目录或其下的文件。ENOTEMPTY,ENOTDIR和EACCES故障意味着缓存已刷新,但ENOENT并未刷新它。FreeBSD不缓存否定条目,因此不必刷新它们。
http://web.archive.org/web/20100912144722/http://www.unixcoding.org/NFSCoding