如何从IOException异常消息中提取文件路径?
从IOException消息中提取文件路径的解决方案
针对你遇到的问题,最直接的方式是利用正则表达式匹配异常消息中被单引号包裹的文件路径——因为当文件被其他进程占用时,这类IOException的消息格式是固定的,目标路径会被包含在单引号内。
具体实现步骤:
- 先确保引用
System.Text.RegularExpressions命名空间; - 在
catch块中,用正则匹配消息里的单引号内容,提取出目标路径。
修改后的代码如下:
using System; using System.IO; using System.Text.RegularExpressions; // 新增命名空间 class Program { static void Main(string[] args) { string[] files = Directory.GetFiles(@"C:\Temp", "*_test.xlsx", SearchOption.AllDirectories); try { if (files == null || files.Length == 0) { // 补充空数组判断,原代码只判断null存在逻辑漏洞 Console.WriteLine("File Not Found"); } else { foreach (var file in files) { using (Stream stream = new FileStream(file, FileMode.Open)) { // Do Nothing } } } } catch (IOException ex) { // 匹配单引号之间的内容,捕获目标文件路径 var match = Regex.Match(ex.Message, @"'([^']+)'"); if (match.Success) { string targetFilePath = match.Groups[1].Value; Console.WriteLine(targetFilePath); // 仅输出目标文件路径 } else { // 异常消息格式不符合预期时的兜底逻辑 Console.WriteLine("无法提取目标文件路径"); } } } }
额外说明:
- 正则表达式
@"'([^']+)'的作用:匹配以单引号开头的内容,捕获所有非单引号字符(即目标文件路径),直到遇到下一个单引号为止,完美适配这类异常的消息格式。 - 补充
files.Length == 0的判断:因为Directory.GetFiles在找不到文件时返回的是空数组而非null,原代码的判断逻辑存在遗漏。 - 你之前尝试的
frame.GetFileName()方法,它获取的是抛出异常的程序代码文件路径,而非被占用的目标文件路径,所以确实不适合你的场景。
内容的提问来源于stack exchange,提问作者IanHacker
相关产品推荐
相关产品推荐

