【发布时间】:2009-02-13 16:02:19
【问题描述】:
我的问题与What is the best way to test whether a file exists on Windows? 的问题略有不同,但有一些具体的警告。具体来说,数据位于映射驱动器上,并使用 SMB 2.0 协议。 (根据定义,这需要将驱动器从 Vista 机器映射到 Vista 或 Server 2008 机器。)
在回复上述问题时发布的答案的问题是 SMB 2.0 缓存了一堆元数据,包括给定目录中的文件名。因此,如果您正在测试是否存在刚刚创建的文件,那么函数 _access、access、GetFileAttributes 和 CreateFile(可能还有其他)都将使用缓存信息来回答问题“这个文件存在吗?”。如果该文件是由另一个用户最近创建的,则缓存指示该文件不存在,尽管它确实存在。我已经设置了测试环境来对此进行测试,并且我可以确认 no SMB2 流量由客户端生成几秒钟[大概缓存每 5 秒左右过期一次]。
还有其他人看过吗? (如果是这样,除了添加延迟/重试之外,您是否找到了解决方法?)有没有人知道任何类似于上述的 API 可以在不使用 SMB 缓存的情况下检查文件是否存在?或者,更好的是,有人知道 Windows API 会简单地转储缓存的 SMB 元数据吗?
【问题讨论】:
-
为什么你需要这样做?如果缓存给出“错误”的答案,为什么会出现问题?什么取决于它“工作”?
-
好吧,无需过多介绍,用户启动一个进程,该进程会导致在共享中创建一个新文件。如果该文件是由另一台计算机创建的,则“错误”答案意味着用户无法打开该文件,因为如果该文件“不存在”,SMB2 将不会发送打开请求。
-
我认为您应该详细说明。我想设计的其他方面可以改进以提供令人满意的用户体验。
标签: c windows-vista