我正在尝试解决用户可以尝试使用 OpenFileDialog
打开由 Excel 打开的文件的问题。
使用简单的FileInfo.OpenRead()
,它会抛出一个IOException
,“该进程无法访问文件“cakes.xls”,因为它正在被另一个进程使用过程。”这可以很好地向用户显示,除非用户实际上会得到“调试资源字符串不可用”的废话。
似乎无法打开由另一个进程打开的文件,因为使用 FileInfo.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
会抛出 SecurityException
,“不允许文件操作。拒绝访问路径 'C:\whatever\cakes.xls'。”,对于任何文件。相当无益。
因此,要么找到某种方法来检查文件是否被锁定,要么 try catch IOException。我不想捕获所有 IOExceptions 并假设它们都是锁定文件错误,因此我需要某种方法将此类异常分类为此错误......但是“调试资源” strings”的废话加上该消息本身可能是本地化的这一事实使得它变得棘手。我部分信任,因此无法使用 Marshal.GetHRForException
。
那么:是否有任何明智的方法可以检查文件是否被锁定,或者至少确定是否发生此问题而不只是捕获所有 IOException?
最佳答案
我刚刚解决了这个问题:就像阅读文档一样简单。
- FileNotFoundException - 未找到文件。
- UnauthorizedAccessException - 该文件是只读的或者是 目录。
- DirectoryNotFoundException - 指定的路径是 无效,例如位于未映射的驱动器上。
- IOException - 文件已打开。
因此,捕获所有 IOException 并将它们视为文件已打开问题是安全的,因为指定这是抛出 IOException 的唯一情况。
关于silverlight - 检查文件是否被锁定或捕获尝试打开的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11183067/