c - 在 Windows Vista 的网络共享上测试文件是否存在的最佳方法是什么?

标签 c windows-vista

我的问题与问题 What is the best way to test whether a file exists on Windows? 略有不同,有一些具体的警告。具体来说,数据位于映射驱动器上,并使用 SMB 2.0 协议(protocol)。 (根据定义,这要求驱动器从 Vista 机器映射到 Vista 或 Server 2008 机器。)

回复上述问题的答案的问题是 SMB 2.0 缓存了一堆元数据,包括给定目录中的文件名。因此,如果您正在测试是否存在刚刚创建的文件,那么函数 _access、access、GetFileAttributes 和 CreateFile(可能还有其他)都将使用缓存信息来回答“此文件是否存在?”的问题。 .如果该文件是由另一个用户最近创建的,则缓存指示该文件不存在,尽管它确实存在。我已经设置了测试环境来测试这个,我可以确认客户端在几秒钟内没有生成 SMB2 流量[大概缓存每 5 秒左右过期一次]。

有没有其他人看过这个? (如果是这样,除了添加延迟/重试之外,您是否找到了解决方法?)有没有人知道任何类似于上述的 API 可以在不使用 SMB 缓存的情况下检查文件是否存在?或者,更好的是,有人知道 Windows API 会简单地转储缓存的 SMB 元数据吗?

最佳答案

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

关于c - 在 Windows Vista 的网络共享上测试文件是否存在的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/546486/

相关文章:

.NET - 启用 UAC (Windows7/Vista) 时,应用程序如何能够 self 更新?

http - netsh http 添加 urlacl : add reservation for a group

c++ - 转义 printf() 中的所有特殊字符

c - Linux内核模块编译错误: implicit declaration of function ‘open’

c++ - 无法在 64 位 Vista 上运行使用 MinGW Dev-C++ 编译的 C 程序

c# - 为什么 RequestAdditionalTime() 方法在 Vista/7 中重启时不起作用?

java - java在windows vista上安装和使用play框架

c - 如何让 switch() 在 C 中循环多次?

c - @zero_extendqisi2 的含义

c - C语言的贪吃蛇游戏