检查文件是否已锁定或尝试打开时捕获错误

时间:2012-06-25 03:12:21

标签: silverlight filestream silverlight-5.0 openfiledialog

我正在尝试解决用户可以尝试使用OpenFileDialog打开由Excel打开的文件的问题。

使用简单的FileInfo.OpenRead(),它会删除IOException,“进程无法访问文件'cakes.xls',因为它正由另一个进程使用。”除了用户实际上会得到“调试资源字符串不可用”这些废话外,这对用户来说很好。

似乎无法打开另一个进程打开的文件,因为使用FileInfo.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite) chucks SecurityException,“不允许文件操作。访问路径'C:\ whatever \ cakes。 xls'被拒绝。“,对于任何文件。相当无益。

因此要么找到某种方法来检查文件是否被锁定,或者尝试捕获IOException。我不想捕获所有 IOExceptions并假设它们都是锁定文件错误,因此我需要某种方法将此类异常分类为此错误...但是“调试资源”字符串“废话以及该消息本身可能是本地化的事实使得它变得棘手。我部分信任,所以我不能使用Marshal.GetHRForException

那么:是否有任何明智的方法可以检查文件是否被锁定,或者至少在没有捕获所有IOExceptions的情况下确定是否发生了这个问题?

1 个答案:

答案 0 :(得分:2)

我刚刚解决了这个问题:它就像阅读文档一样简单。

FileInfo.Open指定:

  • FileNotFoundException - 找不到该文件。
  • UnauthorizedAccessException - 文件是只读的或是 目录。
  • DirectoryNotFoundException - 指定的路径是 无效,例如在未映射的驱动器上。
  • IOException - 文件已经打开。

因此,捕获所有IOExceptions并将它们视为此文件已经打开的问题是安全的,因为它指定了这是抛出IOException的唯一情况。