4

请参阅评论以获取解决方案-文件位于错误的位置

我到处寻找答案,但我一直找不到。这对我来说真的很令人沮丧,因为我从来没有遇到过使用任何其他编程语言从文件中读取的麻烦。

我正在尝试从文本文件中提取用户名和密码,用于基本的即时通讯程序。我不会发布所有代码——它太长了,而且很可能是不相关的,因为在程序的一开始就读取了文本文件。

这是我试图从中读取的文本文件(“users.ul”)的内容:

admin.password
billy.bob
sally.sal

这是从文本文件中读取的代码:

users = new Dictionary<string, User>();

System.Console.WriteLine("users.ul exists: " + File.Exists("users.ul"));

// Check the status of users.ul. If it exists, fill the user dictionary with its data.
if (File.Exists("users.ul"))
{
    // Usernames are listed first in users.ul, and are followed by a period and then the password associated with that username.
    StreamReader reader = new StreamReader("users.ul");
    string line;
    int count = 0;

    while ((line = reader.ReadLine()) != null)
    {
        string[] splitted = line.Split('.');
        string un = splitted[0].Trim();
        string pass = splitted[1].Trim();

        User u = new User(un, pass);

        // Add the username and User object to the dictionary
        users.Add(un, u);

        count++;
    }

    System.Console.WriteLine("count: " + count);

    reader.Close();
}

这是我的代码产生的输出:

users.ul exists: True
count: 1

添加到用户字典的唯一数据是“admin”,密码为“password”。其他行被忽略。

请帮帮我。如果没有多个用户,我的程序毫无用处。我到处寻找解决方案,包括该站点上的其他类似问题。从没想过从文件中读取会导致我浪费这么多时间。

4

2 回答 2

10

除非您特别需要了解使用 StreamReader 的复杂性,否则我建议使用File.ReadAllLines(),它返回一个(可枚举的)字符串数组。

更好的是,使用 linq :-)

System.Console.WriteLine("users.ul exists: " + File.Exists("users.ul"));

// Check the status of users.ul. If it exists, fill the user dictionary with its data.
if (File.Exists("users.ul")) {
    var lines = File.ReadAllLines("users.ul");
    // Usernames are listed first in users.ul, and are followed by a period
    // and then the password associated with that username.
    var users = lines.Select(o => o.Split('.'))
                     .Where(o => o.Length == 2)
                     .Select(o => new User(o[0].Trim(), o[1].Trim());

    System.Console.WriteLine("count: " + users.Count());
}
于 2013-03-15T21:55:58.670 回答
5

只是无法抗拒将其重构为单行的诱惑:

var users = File.ReadAllLines("users.ul").Select(l => new User(l.Substring(0, l.IndexOf('.')), l.Substring(l.IndexOf('.') + 1))).ToDictionary(u => u.Name);
于 2013-03-15T22:05:00.270 回答