除了解析.message属性之外,是否有可靠的方法来识别由锁定文件引起的IOexceptions?

Joh*_*nFx 3 .net exception-handling ioexception

例如,假设以下片段的VB.NET代码删除目录.

 Try
      Dim SomeFolder="c:\somefolder"
      System.IO.Directory.Delete(SomeFolder, True)    
 Catch ioex As System.IO.IOException     
     'What went wrong? 
     'File locked by another process? 
     'File not found? 
     'something else?
 End Try       
Run Code Online (Sandbox Code Playgroud)

在异常处理程序中,如果目录或其中的文件是打开的,我想让用户有机会关闭文件并重试操作,但前提是IOException是由锁定问题引起的.

问题是IOException可能由于多种原因而被抛出,例如在文件上设置了无效路径或只读标志.这些条件中的每一个都设置了不同的值.异常对象的message属性,但是对错误消息中的特定字符串进行硬编码以检测失败的具体原因只是错误.我不太相信错误字符串将与.net的未来版本一致,并且不愿意编写本地化代码以处理消息以非英语之外的其他方式返回的可能性.

必须有一种更好的方法来处理一个非常常见的异常处理问题.我错过了什么吗?

更新/澄清:感谢目前为止的答案,但我可能让我的例子有点过于通用.至少现在,我正在寻找一种方法来检测由异常处理程序中的另一个进程锁定的文件的状况.

Ode*_*ded 7

您可以捕获从IOException继承的一些异常.

这些措施包括DirectoryNotFoundException,FileNotFoundException等等.

使用异常处理:

Try
  Dim SomeFolder="c:\somefolder"
  System.IO.Directory.Delete(SomeFolder, True)    
Catch fnfex As System.IO.FileNotFoundException     
 'What went wrong? 
 'File not found? 
Catch ioex As System.IO.IOException     
 'What went wrong? 
 'something else?
End Try       
Run Code Online (Sandbox Code Playgroud)

更新:

对于文件操作,最好在操作之前测试文件/文件夹的存在.这是最佳做法,因为您避免了不必要的例外:

Dim SomeFolder="c:\somefolder"

If Directory.Exists(SomeFolder) Then
   System.IO.Directory.Delete(SomeFolder, True)
End If
Run Code Online (Sandbox Code Playgroud)

更新2:

关于锁定文件的评论和更新后面.我遇到了同样的问题并且确实解析了异常消息,因为没有FileLockedException或类似:(

  • 重新考虑更新:这是最佳做法,但当然不应该*替换*正确的异常处理,因为文件可能已被删除/同时移动. (2认同)