我试图打开一个文件.这是我的输出(我在try/catch中构建的字符串):
打开c:\ Program Files(x86)\ MyApp\storedUsers.txt - > System.FormatException - >输入字符串格式不正确时出错.
以下是如何打开它:
installPath = @"C:\Program Files (x86)\MyApp\";
FileStream userFile = new FileStream(installPath + "storedUsers.txt", FileMode.OpenOrCreate, FileAccess.Read);
StreamReader userStream = new StreamReader(userFile);
while (userStream.Peek() >= 0)
{
string line = userStream.ReadLine();
storedUsers.Add(line.Split(',')[0], int.Parse(line.Split(',')[0]));
}
userStream.Close();
Run Code Online (Sandbox Code Playgroud)
我的抓到:
WriteToLogFile("Error opening " + installPath + "storedUsers.txt -> " + ex.GetType() + " -> " + ex.Message);
Run Code Online (Sandbox Code Playgroud)
我无法绕过什么错误...
我打算在这里做出猜测,因为你没有给我们足够的答案给你一个坚实的答案.
我打赌问题是解析该行部分,这个表达式:
int.Parse(line.Split(',')[0])
Run Code Online (Sandbox Code Playgroud)
在所有情况下,这实际上并没有给你一个数字.
所以你应该查看该文件,并可能将代码更改为:
string[] parts = line.Split(',');
... int.Parse(parts[0]) ...
Run Code Online (Sandbox Code Playgroud)
然后,您可以检查该数组的内容,以查看第一列中的内容.
正如评论中所指出的,更好的方法是不要盲目地假设解析会成功,另外你可能想要确保你使用正确的文化信息.
这是我要做的,假设数字由程序输出,用于读入另一个程序:
int value;
if (Int32.TryParse(parts[0], NumberStyles.Integer, CultureInfo.InvariantCulture, out value))
... your code here, use value where you need it
else
what to do in the case of unable to parse the string as a number
Run Code Online (Sandbox Code Playgroud)
预感,你需要修剪内容吗?试试这个简单的改变:
... int.Parse(line.Split(',')[0].Trim()) ...
^--+--^
|
+-- add this
Run Code Online (Sandbox Code Playgroud)
其他提示:
使用Path.Combine为路径结合:
new FileStream(Path.Combine(installPath, "storedUsers.txt")
Run Code Online (Sandbox Code Playgroud)重写你的阅读循环:
string line;
while ((line = userStream.ReadLine()) != null)
{
...
}
Run Code Online (Sandbox Code Playgroud)使用该using子句处理您的流:
using (FileStream userFile = new FileStream(...))
{
...
}
// delete the .Close() line, this is handled by the } on the preceeding line
Run Code Online (Sandbox Code Playgroud)最终版本:
installPath = @"C:\Program Files (x86)\MyApp\";
using (FileStream userFile = new FileStream(
Path.Combine(installPath, "storedUsers.txt"),
FileMode.OpenOrCreate, FileAccess.Read))
using (StreamReader userStream = new StreamReader(userFile))
{
string line;
while ((line = userStream.ReadLine()) != null)
{
string[] parts = line.Split(',');
int userId;
if (Int32.TryParse(parts[0], NumberStyles.Integer, CultureInfo.InvariantCulture, out userId))
storedUsers.Add(userId);
}
}
Run Code Online (Sandbox Code Playgroud)
当然,如果文件不是太大,你可以用一点LINQ重写整个shebang:
// warning, LINQ with side-effects, evaluate here, don't use it lazily
int tempUserId = 0;
List<int> userIds = File
.ReadAllLines(Path.Combine(installPath, "storedUsers.txt"))
.Select(l => l.Split(',')[0])
.Where(p0 => Int32.TryParse(p0, NumberStyles.Integer, CultureInfo.InvariantCulture, out tempUserId))
.Select(dummy => tempUserId)
.ToList();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
679 次 |
| 最近记录: |