我正在使用旧代码库。该应用程序是一个用 C、C++ 和 Delphi 编码的复杂会计系统。它使用内部共享文件数据库系统进行存储:数据存储在应用程序直接访问的文件中。并发用户从他们的联网机器访问这些文件,并且应用程序使用文件锁定来保护并发访问。
该系统已经运行了 25 年以上,或多或少都可以正常工作,并且已部署在数千个地点,因此我们知道它大部分都很好。
我在一个客户那里遇到了一个非常奇怪的问题:看起来大约每隔几天,操作系统就会向应用程序报告它正在处理的文件不存在或者它是空的。发生这种情况时,应用程序要么无法显示数据(如果它正在访问数据文件),要么假设文件确实不存在并尝试重新创建它(如果是索引文件),导致明显的数据丢失.
我们用梳子检查了日志并添加了许多额外的检查,但我们一直找不到任何错误。
我们有两类失败:
- GetFileAttributes失败,GetLastError返回ERROR_FILE_NOT_FOUND (0x2)。
- ReadFile失败(返回 0),GetLastError返回 ERROR_HANDLE_EOF (0x26)
奇怪的是,我们找不到任何写入数据的失败。发生错误时,它特定于该文件:正确写入日志文件(与数据磁盘位于同一网络共享上)。我们不能完全排除任何锁定和写入锁定文件的失败,但我们找不到任何此类事件的痕迹。
我们的主要嫌疑人是 AV:卡巴斯基。有时,这是我们唯一能看到的可能会干扰某些 API 的结果。
有没有人遇到过类似的事情?