All*_*len 5 c# windows file-io caching network-drive
我有一个商业软件,它将客户信息写入网络 Windows 驱动器上的二进制文件。该架构阻止我使用该网络驱动器以外的任何东西。
我编写了一个 C# 应用程序来解析此二进制文件中的数据。该应用程序只是处于循环中,等待该文件被修改,然后解析客户信息以查找更改的内容。然后它将更新我自己的自定义数据库中的客户记录。
问题:
我是一名 Linux 人员,我的第一个想法是我在 Linux NFS 挂载上看到了类似的问题,并修复了它们,尽管已经很久以前我不记得确切的解决方案了。
我试过了:
使用组策略编辑器禁用所有文件的脱机文件。这不起作用。
客户更改后,通用长时间休眠,然后再读取更新的二进制文件。这不起作用。
** 这里有趣的一点是,我的代码将检测修改后的时间戳并对其进行处理,但内容似乎仍然被缓存
我已经对所有内部数据结构进行了三次检查,以确保它们在每次迭代中都是干净的。那里没有缓冲数据。
甚至在网上发现了一个黑客,其中一个人说,如果您将文件添加到同一目录,然后删除它,它会以某种方式强制目录刷新。这并没有奏效,但以不同的方式突出了问题。如果我创建临时/黑客文件然后立即尝试删除它,它不起作用,因为我的应用程序看不到新的黑客文件。即使在创建和删除之间有几秒钟的睡眠。
我尝试以编程方式将此文件移动到末尾带有 _ 的相同文件名,然后再读取它。我的想法是,编写这个始终是唯一的新文件,会以某种方式迫使 Windows 为我提供该文件夹中最新、最好的文件。然而,当我尝试读取这个新的/唯一的文件时,它告诉我找不到该文件,即使我可以通过 Windows 资源管理器看到它。似乎我正在阅读该目录的某些缓存版本。
奇怪的测试行为:
在操作上,有多个用户和站点正在修改此客户数据,因此大量数据变化非常快。我只需要一种方法来强制读取实际数据文件。感谢你们提供的任何帮助。
更新:使用一些评论,我让它工作,但我不会说我实际上找到了解决方案。这只是一个黑客行为。我只是结合了我之前认为应该有效(但没有)的所有内容并进行了测试。首先,我将文件复制到同一目录,并将纪元添加到末尾。然后,我进入循环,通过检查 FileInfo.Exists 来查找该文件。当它没有看到它时,我使用 FileInfo.Refresh(),睡一会,然后重试。在我的测试中,最多需要 15 秒才能打破这个循环。一分钟后,它会出错,只是为了防止这里出现无限循环。然后我删除临时文件。
再说一次,我知道这是非常丑陋和混乱的,所以我仍然对任何能提供如何更正确地处理这个问题的答案的人感兴趣。