c#文件移动和覆盖

pro*_*ngs 4 c# multithreading ioexception race-condition

我正在开发一个多线程应用程序.我的代码中有一处:

File.Delete(sidetapedata);
File.Move(sidetapedata2, sidetapedata); //sidetapedata and sidetapedata2 are two file paths that correspond to sidetapedata.txt and sidetaptdata2.txt in some directory.
Run Code Online (Sandbox Code Playgroud)

第二行有时运行良好,其他时候,它抛出IOException:

Cannot create a file when that file already exists.
Run Code Online (Sandbox Code Playgroud)

还有一个线程正在访问该sidetapedata文件,但该文件只读取此文件,没有写入操作.我正在使用锁来保护竞争条件.不知道为什么会这样.

更新:即使visual c#debugger向我显示此异常,查看包含这些文件的目录,我看到没有sidetapedata.txt文件,但有一个sidetapedata2.txt文件!

UPDATE2:另外,这一行为仅发生在sidetapedata.txtsidetapedata2.txt都是空白

Jon*_*eet 10

不知道为什么会发生这种事,除非有通过在文件系统中触发一些事件Delete,这意味着它不会调用实际删除直到调用返回后略有下降.一些选择:

  • 您可以循环(在出错之前使用某种最大数量的循环),在尝试移动之前检查文件是否存在,如果删除后仍然存在,则暂时休眠
  • 你可以使用File.Copy(sidetapedata, sidetapedata2, true)复制,而不是移动,然后删除源文件.这样效率会降低,假设移动将由简单的文件系统目录条目更改(而不是真正复制数据)来处理
  • 您可以File.Move在目标文件上使用而不是将File.Delete其移动到某个无害的其他文件名,然后删除它,希望它Move比原子文件更原子Delete.

怀疑线程在这里是无关紧要的 - 我建议你写一个简短但完整的程序来验证它,这样你就可以排除它(并轻松测试解决方法).