VS2017中C#读取文件触发System.NotSupportedException异常求助
这种情况我之前排查过好多次,明明文件存在、路径在其他工具里也正常,偏偏.NET就抛出这个异常,大概率是路径里藏了肉眼看不到的坑,咱们一步步来捋:
1. 排查路径中的不可见控制字符
很多时候是复制粘贴路径时带了零宽空格、全角空格、Tab这类不可见字符,虽然你能通过函数拿到文件名,但完整路径里的这些字符会让.NET的文件IO逻辑判定为非法路径。
你可以加一段代码把路径的细节打出来,揪出这些“隐形凶手”:
string yourFilePath = "你当前使用的路径"; Console.WriteLine("原始路径显示: " + yourFilePath); Console.WriteLine("URI转义后路径: " + Uri.EscapeUriString(yourFilePath)); // 逐个字符检查ASCII码,方便定位异常字符 foreach (char c in yourFilePath) { Console.WriteLine($"字符: '{c}' | ASCII码: {(int)c}"); }
正常的路径字符ASCII码都在可打印范围内(32-126),如果看到比如160(全角空格)、8203(零宽空格)这类数值,直接把对应的字符删掉就行。
2. 确认相对路径的工作目录是否正确
你说能获取到文件名"text.txt",如果用的是相对路径,很可能程序的当前工作目录不是你以为的那个。VS默认的工作目录是项目根目录,而不是编译后的输出目录(bin/Debug这类),这会导致路径拼接错误。
可以先打印当前工作目录验证:
Console.WriteLine("当前工作目录: " + Directory.GetCurrentDirectory());
如果确实不对,要么改成绝对路径测试,要么在VS的项目属性里调整“调试”选项卡的“工作目录”到正确的位置。
3. 检查路径中的非法特殊字符
.NET的文件IO对路径合法性的检查比一些工具更严格,比如路径里如果包含*、?、<、>、|这些字符(除了盘符的冒号),哪怕其他工具能识别,.NET也会直接抛出NotSupportedException。
你可以用Path.GetInvalidPathChars()获取所有.NET认定的非法字符,然后检查你的路径里有没有包含这些字符。
4. 极简代码验证
如果上面的排查都没发现问题,写一段最简化的测试代码,用绝对路径直接读取文件,排除其他代码逻辑的干扰:
try { string content = File.ReadAllText(@"C:\测试用的绝对路径\text.txt"); Console.WriteLine("读取成功,内容: " + content); } catch (Exception ex) { Console.WriteLine("异常详情: " + ex.ToString()); }
如果这段代码能正常运行,说明问题出在你原来的路径处理逻辑上;如果还是报错,那可能要检查文件本身的属性(比如是不是被其他进程锁定了?不过锁定一般是IOException)。
内容的提问来源于stack exchange,提问作者NewDeveloper

