我试图打开一个文件。这是我的输出(字符串我在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();
我的捕获:
WriteToLogFile("Error opening " + installPath + "storedUsers.txt -> " + ex.GetType() + " -> " + ex.Message);
我无法绕过什么错误......
答案 0 :(得分:5)
我会冒这个猜测,因为你没有给我们足够的答案给你一个坚实的答案。
我打赌问题是解析该行部分,这个表达式:
int.Parse(line.Split(',')[0])
在所有情况下,实际上并没有给你一个数字。
因此,您应该查看该文件,并可能将代码更改为:
string[] parts = line.Split(',');
... int.Parse(parts[0]) ...
然后,您可以检查该数组的内容,以查看第一列中的内容。
正如评论中所指出的,更好的方法是不要盲目地假设解析会成功,另外你可能想要确保你使用正确的文化信息。
这是我要做的,假设数字是由程序输出的,用于读入另一个程序:
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
预感,你需要修剪内容吗?试试这个简单的改变:
... int.Parse(line.Split(',')[0].Trim()) ...
^--+--^
|
+-- add this
其他提示:
使用Path.Combine
组合路径:
new FileStream(Path.Combine(installPath, "storedUsers.txt")
将您的阅读循环重写为:
string line;
while ((line = userStream.ReadLine()) != null)
{
...
}
使用using
子句处理您的信息流:
using (FileStream userFile = new FileStream(...))
{
...
}
// delete the .Close() line, this is handled by the } on the preceeding line
最终版本:
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);
}
}
当然,如果文件不是太大,你可以使用一点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();
答案 1 :(得分:0)
我认为你应该从清单(或测试用例)开始,例如:
文件是否存在?我在这里假设 - 是的。
我打开文件进行读写吗?如果只是阅读,请不要使用FileMode.OpenOrCreate
,而是使用FileMode.Open
。
string line
包含哪些内容?
a)是空白吗?
4)Split
函数调用的结果是什么?
a)是否为空?
b)您是否接受此阵列中的空条目?
c)是否有超过0的条目?
然后,如果可能,请避免重复代码。
//Pseudo-code + C#
string line = userStream.ReadLine();
string[] arr = line.Split(','); //called once
if (arr.Length > 0 && arr[0].Trim().Length > 0) storedUsers.Add(arr[0], int.Parse(arr[0]));
//you can put extra checks.