为什么使用以下代码
string filePath = @"C:\test\upload.pdf"
FileStream fs = File.OpenRead(filePath);
引发以下异常?
The filename, directory name, or volume label syntax is incorrect :
'C:\ConsoleApp\bin\Debug\netcoreapp2.1\C:\test\upload.pdf'
C:\ConsoleApp\bin\Debug\netcoreapp2.1\
目录来自哪里?
更新:
在我的情况下,File.OpenRead()
存在于dll中,并且filePath
({C:\test\upload.pdf
)通过使用该dll的应用程序发送。
答案 0 :(得分:8)
该字符串以不可见的字符开头,因此它不是有效路径。
(int)@"C:\test\upload.pdf"[0]
返回
8234
或十六进制202A
。那就是LEFT-TO-RIGHT EMBEDDING标点符号
更新
Raymond Chen发表了文章Why is there an invisible U+202A at the start of my file name?。
我们看到了some time ago,作为最后的选择,您可以插入字符U + 202B(从右向左嵌入)以强制将文本解释为从右到左。相反的字符是U + 202A(从左向右嵌入),它强制将文本解释为从左到右。
“安全性”对话框会在文件名字段中插入该控制字符,以确保the path components are interpreted in the expected manner。不幸的是,这还意味着,如果您尝试将文本复制到对话框外,则会附带Unicode格式控制字符。由于角色通常是不可见的,因此可以造成各种无声的混乱。
(我们很幸运,记事本和命令提示符很快就发现了混乱。但是,假设您已将路径粘贴到C程序的源代码中!)
自那篇文章进入记事本以来的4年中,UTP8已得到支持,因此字符不会被问号代替。粘贴到具有不完整的UTF8支持的当前Windows控制台中仍会替换该字符。
答案 1 :(得分:-3)
在我的情况下,File.OpenRead()存在于dll中。
在存在File.OpenRead的dll的属性中设置CopyLocal = true。