3

StreamReader我在 C# 中打开对象时遇到问题。我总是收到异常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
4

3 回答 3

4

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

任何时候 VS 给出非法字符例外,检查潜在的隐藏字符!

于 2012-09-26T15:27:16.860 回答
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";

因此,如果您说第一个失败但第二个成功,那么,我猜还有其他失败的地方,您没有向我们展示您的真实代码。

于 2012-09-26T14:42:09.663 回答
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);               
        }
于 2020-05-14T15:58:16.340 回答