本文记录我所在的团队的一个简单的 WPF 应用程序在某个用户设备上跑出来的诡异行为。这个程序会从网上下载资源,下载的时候先下载到临时文件,再通过移动重命名的方式放到正确的路径。偶尔会出现下载成功,但是移动过程失败,但远程过去看却发现实际移动成功了
我使用 Get-WmiObject Win32_DiskDrive
命令在 PowerShell 里面调用 WMI 读取硬盘信息,可以看到如下输出内容
通过设备管理器能看到如下界面
经过 lsj 的分析,预计是虚拟磁盘的问题,导致移动成功了,但是 Win32 给出错误信息
为了更好复现问题,我编写了以下测试程序。经过我的测试,这个问题和 WPF 无关,且和 dotnet 无关,和网络下载无关。仅仅只是以下简单的多个文件同时写入,写入之后进行移动,就能复现问题
以上代码使用 MockDownloadAsync 方法代替真实的网络下载。同时执行多个文件的写入,似乎能够让虚拟磁盘更加忙碌,于是就能够复现问题
抛出的异常如下
对应的 Win32 错误码是 0x80070003
解决方法:
只能规避,规避方法是捕获 System.IO.DirectoryNotFoundException 异常,在异常里面判断移动之后的新文件是否存在,如果存在则证明是移动成功,只是虚拟磁盘在逗而已
本文代码放在 github 和 gitee 上,可以使用如下命令行拉取代码。我整个代码仓库比较庞大,使用以下命令行可以进行部分拉取,拉取速度比较快
先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
以上使用的是国内的 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码。如果依然拉取不到代码,可以发邮件向我要代码
获取代码之后,进入 Workbench/RecedajeeKewhinuhoyay 文件夹,即可获取到源代码
更多技术博客,请参阅 博客导航
原文链接: http://blog.lindexi.com/post/%E8%AE%B0-QEMU-%E8%99%9A%E6%8B%9F%E7%A3%81%E7%9B%98%E8%AE%BE%E5%A4%87%E7%A7%BB%E5%8A%A8%E6%96%87%E4%BB%B6%E6%8A%9B%E5%BC%82%E5%B8%B8%E4%BD%86%E5%AE%9E%E9%99%85%E7%A7%BB%E5%8A%A8%E6%88%90%E5%8A%9F
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系。