使用StreamReader时路径中的字符非法

时间:2012-09-26 14:39:48

标签: c# file-io

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

我已经完成了所有失败的八种排列,这些排列在下面被注释以供参考。为了便于阅读,请假设我声明dirInifileIni而不是接收其值作为另一种方法的输出。话虽如此,声明样式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

3 个答案:

答案 0 :(得分:4)

问题是该方法返回了一个字符串,该字符串末尾有一个字段分隔符,这是非法字符。我也在我的测试代码中使用这些字符串。我将我的代码粘贴到记事本++中,这就是它向我展示的内容:

Field Separators http://dbwire.com/img/Answer.jpg

删除FS后,一切正常运行。谢谢大家帮我测试代码,特别是@Dynguss。

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

答案 1 :(得分:3)

以下内容应该有效:

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";

所以,如果你说的是第一次失败但第二次失败,那么,我想还有其他一些失败的东西,你没有向我们展示你的真实代码。

答案 2 :(得分:0)

我也遇到了同样的错误,对我来说,这是由于在StreamReader中使用字符串而不是路径引起的。

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

我删除了StreamReader行并得到了我想要的。

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