【发布时间】:2015-04-22 12:45:36
【问题描述】:
我有一个功能应该通过将所有文件从源文件夹复制到目标文件夹来创建源文件夹的备份。该函数使用由FindFirstFile / FindNextFile 驱动的while 循环,然后为Find... 函数找到的每个文件调用CopyFile。
现在当源文件夹是 SMB 网络路径(无论我使用映射驱动器还是 UNC 路径)时,有时会发生 FindNextFile“看到”文件,但 CopyFile 拒绝复制文件.错误码为2,即ERROR_FILE_NOT_FOUND。
我觉得这难以置信,所以我在备份函数中添加了对_access 的调用,该函数在调用CopyFile 之前检查文件是否存在。结果与CopyFile相同,即_access报告文件不存在(返回码-1和errno为2,即ENOENT)。
所以我的主要问题是:FindFirstFile / FindNextFile 怎么可能“看到”CopyFile 和 _access 都看不到的网络文件夹上的文件?
其他信息/诊断:
- 有问题的文件是在运行备份功能之前创建的文件。具体来说,它是这样工作的:在客户端机器上运行的进程与在服务器机器上运行的进程有网络连接。客户端进程告诉服务器进程创建文件。这应该是同步工作的:只有在服务器进程确认它已创建文件后,客户端进程才会继续执行备份。
- 我在备份功能中添加了重试机制。有了这个,
CopyFile和_access在重试大约 4 秒后突然开始看到有问题的文件。这向我表明确实存在某种网络延迟。似乎FindFirstFile/FindNextFile访问网络路径的方式与CopyFile/_access不同。
不幸的是,我对此效果的研究没有发现任何有用的信息,所以我只能推测。如果FindFirstFile / FindNextFile / CopyFile 确实不能很好地协同工作,您是否知道另一组更可靠的查找/复制 API 函数?
【问题讨论】:
-
@HansPassant 好主意,但在这种情况下,罪魁祸首确实是 SMB 缓存(请参阅接受的答案)。