【问题标题】:What is the best way to test for file existence on a network share on Windows Vista?在 Windows Vista 的网络共享上测试文件是否存在的最佳方法是什么?
【发布时间】: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


【解决方案1】:

致电open(path, O_CREAT | O_EXCL, mode) 并检查结果。如果文件已经存在,这会导致错误。当然,这将通过 SMB 缓存写入并给出正确的结果,否则它将非常不可靠。因此,如果调用成功,则文件文件 没有 存在,但它现在存在,因此您可能需要删除它(取决于应用程序逻辑)。如果调用失败,则文件已经存在。

【讨论】:

    【解决方案2】:

    虽然不是程序化解决方案,但我找到了一种有效的解决方法(在 Microsoft 支持的帮助下)。我想在这里发布解决方法,以防其他人像我一样对此感到沮丧。由于此行为是 SMB2 的“功能”,Microsoft 提供了以下注册表项来覆盖默认的元数据缓存生命周期:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters\FileInfoCacheLifetime 
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters\FileNotFoundCacheLifetime 
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters\DirectoryCacheLifetime
    

    每一个都是DWORD值,可以根据自己的需要进行设置。 (在 SMB2 客户端上将这些设置为 0 可以有效解决我的问题。)

    【讨论】:

    【解决方案3】:

    打开它。

    【讨论】:

    • 要是这么简单就好了。如果您在上面看到我对 John Zwinck 问题的回复,则此缓存的最终效果是客户端不会尝试打开它认为不存在的文件。当 dwCreationDisposition 为 CREATE_ALWAYS 时,CreateFile 始终有效,但如果使用任何其他值,则可能会失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    相关资源
    最近更新 更多