有一个程序可以执行众所周知的原子文件更新:
file = open("foo.txt.tmp")
... write
file.close()
rename("foo.txt.tmp", "foo.txt")
一些客户报告失败,因为foo.txt.tmp
很忙。我怀疑这可能是由于防病毒软件或其他打开文件进行扫描的程序所致。
我要测试这种情况。为此,我编写了一个程序,该程序使用FileSystemWatcher来检测正在创建或修改的文件,然后将其保持打开状态数毫秒。在C#中,大致是这样的:
watcher = new FileSystemWatcher();
...
// there is also .Created, but it comes earlier anyway
watcher.Changed += OnChanged;
...
...
static void OnChanged(object sender, FileSystemEventArgs e)
{
Task.Run(() =>
{
using(var h = File.Open(e.FullPath, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
Thread.Sleep(500); // some sleep, in real code I can vary it but should not matter
}
})
}
大多数情况下都有效,但是有时打开失败,但出现异常“该进程无法访问文件'...',因为它正在被另一个进程使用”,甚至是“找不到文件'...'”。因此,该文件已经由主程序处理。有时我会屡屡输掉这场比赛,所以有些情况未经检验。
问题是:我怎么能更确定我的测试实现先于其他实现打开文件。应该有可能做,不是吗?否则,防病毒软件将如何处理?