File.Move报“找不到文件”错误的排查与解决尝试
解决File.Move远程共享目录下偶发"Could not find file..."异常问题
问题场景
- 服务A监控远程共享目录内的新文件,发现文件后通过
cmd的ren命令修改文件扩展名,随后触发服务B执行操作 - 服务B调用
File.Move再次修改文件扩展名,偶尔会触发System.IO.File.InternalMove抛出"Could not find file..."错误,但实际文件确实存在
排查过程
- 最初怀疑是网络不稳定导致,但异常出现频率过高,排除该可能性
- 对比.NET源码中相关方法逻辑:
File.InternalMove:先通过InternalExists检查文件是否存在,再调用Win32Native.MoveFileFileInfo.MoveTo:无前置文件存在性检查,直接调用Win32Native.MoveFile
- 尝试改用
FileInfo.MoveTo方法,异常仍会出现 - 最终定位根因:服务A启动包含
ren命令的批处理脚本后,未等待脚本执行完成就触发了服务B;若服务B响应过快,此时ren的重命名操作还未完成,后续的文件移动操作就会报错
解决方案与结果
- 尝试等待批处理执行完成:确实解决了异常,但带来了明显的性能损耗
- 最终改用
File.Move方法:目前未再复现异常,处于持续观察阶段
内容的提问来源于stack exchange,提问作者Michal
相关产品推荐
相关产品推荐

