C# 使用StreamReader时路径中存在非法字符

C# 使用StreamReader时路径中存在非法字符,c#,file-io,C#,File Io,在C#中打开StreamReader对象时遇到问题。我总是在路径中收到异常非法字符。我能让它工作的唯一方法是使用整个路径名,使用@符号,不转义文件路径中的任何\字符。但是,这并没有真正帮助我,因为我从文件路径和文件名的两个独立变量开始,作为另一个方法(不能更改)的输出 我已经经历了八种排列,但都失败了,下面对它们进行了注释以供参考。为了这里的可读性,假设我正在声明dirIni和fileIni,而不是从另一个方法接收它们的值作为输出。尽管如此,声明样式1和2使用所有四种连接方法都失败了。这是怎么回

在C#中打开
StreamReader
对象时遇到问题。我总是在路径中收到异常
非法字符。我能让它工作的唯一方法是使用整个路径名,使用
@
符号,不转义文件路径中的任何
\
字符。但是,这并没有真正帮助我,因为我从文件路径和文件名的两个独立变量开始,作为另一个方法(不能更改)的输出

我已经经历了八种排列,但都失败了,下面对它们进行了注释以供参考。为了这里的可读性,假设我正在声明
dirIni
fileIni
,而不是从另一个方法接收它们的值作为输出。尽管如此,声明样式1和2使用所有四种连接方法都失败了。这是怎么回事?我在其他示例中几乎看到了所有四种连接方法的工作原理

编辑: 我已经简化了代码,以显示对我而言中断的内容的1版本

string dirIni = @"C:\Users\Dan\AppData\Local\MyApp 4.0\INI\";
string fileIni = @"PWTRANSACTION.INI";

try
{
    string transIniFullFileName = Path.Combine(dirIni, fileIni);

    using (StreamReader file = new StreamReader(transIniFullFileName))
    {
        // do StreamReader stuff...
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}
以下是异常的堆栈跟踪:

   at System.IO.Path.CheckInvalidPathChars(String path)
   at System.IO.Path.GetFileName(String path)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
   at System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize)
   at System.IO.StreamReader..ctor(String path)
   at TestApp.Form1.btnTestRead_Click(Object sender, EventArgs e) in C:\Users\Dan\TestApp\Form1.cs:line 4977

以下方面应起作用:

string dirIni = @"C:\Users\Dan\AppData\Local\MyApp 4.0\INI";
string fileIni = "PWTRANSACTION.INI";
string transIniFullFileName = Path.Combine(dirIni, fileIni);
为避免对本地应用程序数据文件夹进行硬编码:

string localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
string dirIni = @"MyApp 4.0\INI";
string fileIni = "PWTRANSACTION.INI";
string transIniFullFileName = Path.Combine(localAppData, dirIni, fileIni);
顺便说一下,以下两个字符串声明是完全相同的:

string transIniFullFileName = "C:\\Users\\Dan\\AppData\\Local\\MyApp 4.0\\INI\\PWTRANSACTION.INI";
string transIniFullFileName = @"C:\Users\Dan\AppData\Local\MyApp 4.0\INI\PWTRANSACTION.INI";

因此,如果你说第一个失败了,但是第二个成功了,那么,我猜还有其他一些东西失败了,你没有向我们展示你的真实代码。

问题是,该方法返回的字符串末尾有字段分隔符,而这是非法字符。我在测试代码中也使用了这些字符串。我将代码粘贴到notepad++中,然后切换到“显示隐藏字符”,然后我可以看到FS字符。卸下FS后,一切正常运行。感谢大家帮助我测试代码,尤其是@Dynguss


任何时候VS给出非法字符异常,检查潜在的隐藏字符

我也有同样的错误,对我来说,这是由于在StreamReader中使用字符串而不是路径造成的

string[] blocks = content.Split(';');
        foreach(string block in blocks)
        {
            StreamReader strReader = new StreamReader(block);
            Debug.WriteLine(block);
        }
我去掉了流线型阅读器,得到了我想要的

string[] blocks = content.Split(';');
        foreach(string block in blocks)
        {
            Debug.WriteLine(block);               
        }

空间有问题吗?也许?你说(意译)“假装我没有从另一个方法接收到值”。这可能是非常重要的…你真的尝试过你在这里展示的方式吗?你100%确定来自其他方法的路径没有非法字符吗?@DanMaguire这位未被替换的人说“把下面的内容都当作垃圾处理”,所以这就像是对所有需要的内容进行反斜杠一样。。它不需要空格,但完全转义的代码和非转义的代码之间显然有区别。我复制了代码,并使用
string transnifullfilename=“C:\\Users\\Dan\\AppData\\Local\\MyApp 4.0\\INI\\PWTRANSACTION.INI”运行它未注释且注释掉了
@
版本。我只点击了一个
目录NotFoundException
。您的本地版本中是否有我们看不到的魔法角色?@DanMaguire简单自包含正确示例(SSCCE)的目的之一是让其他人能够将其复制并粘贴到他们的visual studio实例中,并查看它如何为他们工作。这就是为什么,和以前一样,我建议在一个新项目中这样做,然后确保它仍然以同样的方式失败。这看起来完全合理(我完全同意使用
Path.Combine
作为处理路径的一般规则)。我不知道它为什么被否决了?@sybkar它被否决了,因为它实际上没有解决问题question@SamIam我在回答我的回答的第二部分(在提供我认为正确的方法之后)的问题:<代码>因此,如果你说第一个失败了,但是第二个成功了,那么,我猜还有其他一些东西失败了,而您没有向我们展示您的真实代码。
只需为可能出现的错误添加另一种解释。如果您从某个配置读取文件路径。确保不在实际文件路径后添加“不可见”的空行。我的同事在读取CRM插件配置值作为文件路径时被咬过一次。