C# StreamReader构造函数使用工作目录作为UNC的前缀

C# StreamReader构造函数使用工作目录作为UNC的前缀,c#,.net,streamreader,unc,C#,.net,Streamreader,Unc,我正在通过传递包含UNC路径的字符串来初始化System.IO.StreamReader,但StreamReader ctor正在使用工作目录作为UNC路径的前缀,从而导致System.IO.DirectoryNotFoundException UNC路径存储在applicationSettings中,其值为: ‪ \\networkShareMachine\Projects\hold\tst.csv 我使用以下命令从应用程序设置获取UNC: 公共静态对象GetValue(字符串设置名

我正在通过传递包含UNC路径的字符串来初始化System.IO.StreamReader,但StreamReader ctor正在使用工作目录作为UNC路径的前缀,从而导致System.IO.DirectoryNotFoundException

UNC路径存储在applicationSettings中,其值为:

‪    \\networkShareMachine\Projects\hold\tst.csv
我使用以下命令从应用程序设置获取UNC:


公共静态对象GetValue(字符串设置名称)
{
对象结果=空;
Configuration config=ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
//查找部分
ClientSettingsSection configSection=config.SectionGroups[@“applicationSettings”]。Sections[“VCM.WPF.Properties.Settings”]作为ClientSettingsSection;
var setting=configSection.Settings.Get(settingName).Value.ValueXml.InnerText;
结果=设置;
返回结果;
}
}
Intellisense告诉我“setting”变量的值是正确的,但反斜杠加倍的情况除外:

    string setting = (string)Utils.SettingsReader.GetValue("CSVLocation");

    \\\\networkShareMachine\\Projects\\hold\\tst.csv
然后,通过将UNC值传递到ctor,我创建了一个StreamReader:


使用(var streamReader=新streamReader(路径:设置))
{
...
}
我希望流读取器可以像其他任何时候一样初始化,只是我得到了一个

System.IO.DirectoryNotFoundException。
原因是UNC的前缀是工作目录,如下所示:

'C:\Users\userName\source\repos\VCM\VCM.Models.Test\bin\Debug\‪\networkMachineName\Projects\hold\tst.csv'

StreamReader似乎在为字符串本身添加前缀。它为什么要这样做?我如何防止它?

我可以建议您使用path.IsPathRooted检查您的UNC路径,看看.NET是否真的同意它是绝对路径吗?如果不是,请尝试在字符串开头查找“不可见”的额外字符


可能像“标签”一样?

我认为StreamReader不太可能对您的路径有任何影响。人们总是将UNC路径与
FileStream
一起使用,而
StreamReader
只是用未修改的路径构造一个
FileStream
。我认为这更可能是因为你的路径有问题,比如其中有一个看不见的角色。你能做一个可重复性最低的例子吗?你可以通过硬编码你传递给实例化测试的路径来证明StreamReader不是自己在做这件事。我同意StreamReader不太可能以任何方式操纵输入字符串。我只想确定字符串更改发生的位置。我确实试着传入了一个硬编码字符串,效果很好。因此,我认为问题与StreamReader如何解释字符串有关。为什么它会认为我要求的是相对路径?如果路径不是以
“\\”
或驱动器号开头(在Windows上),它似乎会将其视为相对路径。
使用(var streamReader=newstreamreader(setting.Trim())
有效吗?
设置[0]
的值是否不是
'\'
?在调试器中检查
setting.tocharray()
是另一种验证字符串是否仅包含其显示的字符的方法。我使用了Path.IsPathRooted,结果发现它不是。我使用setting.ToCharArray()发现字符串开头有一个8234,我想这是一个引号。我再次检查了设置文件,没有报价。我使用了调试所拥有的每一个可视化工具,并且没有引用。很奇怪。谢谢你给我展示了这个有用的函数。@Methistemi很高兴它有帮助。8234是用于“从左到右嵌入”的Unicode标记。该文件的默认语言是“从右到左”吗?不是,它只是由VS17中的设置设计器生成的设置文件。我最终使用正则表达式删除了不可见字符。@Methistemi让我们责怪复制/粘贴:)