【问题标题】:Check if file is locked or catch error for trying to open检查文件是否被锁定或捕获错误以尝试打开
【发布时间】:2012-06-26 08:07:30
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你检查过 IOException 对象的不同属性了吗?也许只获取 Message 部分,而不是默认的 ToString() 会给你一个有效的用户反馈?
  • 不幸的是,发布时出现“调试资源字符串不可用”的消息很愚蠢。 Silverlight 运行时的标准客户端版本不包含错误消息。 ToString() 方法只提供了一个堆栈跟踪。

标签: silverlight filestream silverlight-5.0 openfiledialog


【解决方案1】:

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

FileInfo.Open 指定:

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

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

【讨论】:

  • 那么为什么会出现 SecurityException?那是另一种情况,不是吗?
  • FileInfo.Open 有几个不同的覆盖。 one with the most parameters 有更多异常,包括 SecurityException。
  • 啊,这是有道理的,因为您不能使用更简单的版本请求独占访问等。
猜你喜欢
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
相关资源
最近更新 更多