![LockFile 成功但 ReadFile 失败](https://linux22.com/image/803132/LockFile%20%E6%88%90%E5%8A%9F%E4%BD%86%20ReadFile%20%E5%A4%B1%E8%B4%A5.png)
我知道这听起来像是一个编程问题,但实际上不是。请耐心听我说:
我的一位客户遇到了一个我无法解释的奇怪问题:一个程序使用以共享模式打开的共享 SMB 驱动器(Windows 2008R2 服务器)上的文件。
在文件内部执行更新之前,程序将使用以下方法锁定特定药水锁文件,读取数据,将所需的更改写入这些部分,然后解锁它们。
这样做是为了确保同一程序的多个实例可以覆盖彼此的更改。
在我的客户案例中,该程序(多年来在所有其他位置都表现良好)成功锁定了文件,但随后对同一句柄的 ReadFile 调用失败,并且 GetlastError 返回错误 64The specified network name is no longer available
因此,我的问题是:
Windows SMB 客户端或服务器中的某些设置是否会导致类似情况?
在我看来,它看起来像一个乐观锁,但 Windows 默认不执行乐观锁(它确实机会锁)。
我首先怀疑这个问题是由防病毒软件(卡巴斯基)引起的,但网站管理员发誓所有 AV 都排除了该网络路径,无论是在客户端还是在文件服务器上。
客户端操作系统是 Windows XP、7、2003 和 2008R2 的混合版本(通过终端服务)。这种情况似乎只发生在负载较大的时候(早上每个人都来上班时或晚上每个人都退出时)。
答案1
嗯,答案比我想象的要简单得多:服务器 NIC 的设备驱动程序故障显然是造成所有这些问题的根源。
答案2
在我看来,这确实是一个编程问题,但可以通过降级操作系统将其恢复到以前的“工作”方式。Windows 7 在 CIFS 中引入了一种新的锁定机制,这几乎肯定是导致问题的原因。这意味着您要么需要更新程序以使用新的锁定方案(编程问题),要么需要降级或找到兼容性修复程序(管理员问题)。