您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

os.path.exists()位于

os.path.exists()位于

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

其他 2022/1/1 18:33:01 有353人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶