我正在维护一个访问服务器上数据的桌面应用程序。多个用户可以访问相同的文件。我们有一个库,可以使用 _lopen(C 库函数)打开文件进行检索。我们总是以 SHARE_DENY_NONE 只读方式打开。为了提高性能,我们保持文件打开,直到用户退出应用程序。那是文件关闭的时候。但是,如果超过 20 分钟没有任何活动,我们将失去与服务器的连接。在这种情况下,我们启动连接并再次打开文件。假设连接丢失时调用了文件关闭操作,但没有证据表明调用了文件关闭。
不幸的是,用户每天会收到一两次错误消息,提示他们无法打开文件。我们认为这是因为文件被锁定,因为我们也无法在资源管理器中打开它。清除错误的唯一方法是调用 IISRESET,以便清除所有用于检索的文件句柄。但是,今天我们收到错误消息,这是一个通用文件打开错误,我们能够在资源管理器中打开文件并通过回收应用程序池来解决问题。
因为有些用户在没有做任何事情之前一启动应用程序就得到文件打开错误,我们认为这个问题一定是其他用户(或进程)锁定文件引起的。我们无法复制错误。
我已经查看了源代码以查看文件是如何打开的。我已经查看了 Process Explorer,我们的软件始终可以访问该文件。我查看了进程监视器并看到该文件已打开,允许其他用户进行读/写操作,并且该文件在应用程序关闭时关闭。我们从来没有在我们的开发服务器上收到错误,而只是在生产服务器上。该错误不依赖于大量用户,因为我们无法使用一个测试程序来复制它,该程序用 1000 个不同的用户打开文件 1000 次。此外,我们已经看到只有 9 个用户的错误。
我希望有人可以建议进行其他测试以尝试或可能出现此问题的其他原因。