试图打开文件,格式错误?

时间:2010-10-07 11:31:26

标签: c#

我试图打开一个文件。这是我的输出(字符串我在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);

我无法绕过什么错误......

2 个答案:

答案 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)

我认为你应该从清单(或测试用例)开始,例如:

  1. 文件是否存在?我在这里假设 - 是的。

  2. 我打开文件进行读写吗?如果只是阅读,请不要使用FileMode.OpenOrCreate,而是使用FileMode.Open

  3. string line包含哪些内容?

    a)是空白吗?

  4. 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.