为什么File.OpenRead()将相对路径附加到可执行文件?

时间:2019-05-29 07:46:54

标签: c# .net

为什么使用以下代码

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的应用程序发送。

2 个答案:

答案 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。