3

我正在尝试处理用户可以尝试使用OpenFileDialogExcel 打开的文件打开的问题。

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

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

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

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

4

1 回答 1

2

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

FileInfo.Open指定:

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

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

于 2012-06-27T23:24:32.790 回答