-1

基本上我试图为我的 twitter 类型的网站保存一个新密码和头像。任何帮助将不胜感激我的编码是:

   string newPasswordString = Server.MapPath("~") + "/App_Data/tuitterUsers.txt";
    string[] newPasswordArray = File.ReadAllLines(newPasswordString);
    string newString = Server.MapPath("~") + "/App_Data/tuitterUsers.txt";
    newString = File.ReadAllText(newString);
    string[] newArray = newString.Split(' ');

        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; i++)
            {
                newArray[1] = newPasswordTextBox.Text;
                newArray[2] = avatarDropDownList.SelectedValue;
                newPasswordArray.Replace(" " + Session["Username"].ToString() + " " + Session["UserPassword"].ToString() + " " + Session["UserAvatarID"].ToString() + " ", " " + Session["Username"].ToString() + " " + newPasswordArray[1] + " " + newPasswordArray[2]);
            }

        }
        string newPasswordString = string.Join(Environment.NewLine, newPasswordArray);
        File.WriteAllText(Server.MapPath("~") + "/App_Data/tuitterUsers.txt", newPasswordString);
4

2 回答 2

0

首先,您正在做的是 A Bad Idea™。鉴于 Web 服务器可以有多个线程在运行,您不能确定两个线程不会同时写入不同的数据。您拥有的用户越多,您的用户文件就越大,这意味着读取和写入数据需要更长的时间,这使得两个线程更有可能发生冲突。

这就是我们将数据库用于此类事情的原因。不是每次要读取或写入时都对整个文件进行操作,而是对单个记录进行操作。还有很多其他原因可以这样做。

也就是说,如果您坚持使用文本文件...

如果您将文件中的每一行视为一条记录(在这种情况下为单个用户的详细信息),那么构建一个类来处理这些记录的内容并让该类能够读取和写入行格式是有意义的。

像这样的东西:

class UserRecord
{
    public string Name;
    public string Password;
    public string Avatar;

    public UserRecord(string name, string password, string avatar)
    {
        Name = name;
        Password = password;
        Avatar = avatar;
    }

    // static factory method
    public static UserRecord Parse(string source)
    {
        if (string.IsNullOrEmpty(source))
            return null;
        string[] parts = source.Split(',');
        if (parts.Length < 3)
            return null;
        return new UserRecord(parts[0], parts[1], parts[2]);
    }

    // convert to string
    public string ToString()
    {
        return (new string[] { Name, Password, Avatar }).Join(",");
    }
}

调整Parse方法以处理您对行中数据使用的任何格式,并更改ToString方法以生成该格式。

一旦你有这个工作,用它来解析你的文件的内容,如下所示:

// Somewhere to put the data - a Dictionary is my first choice here
Dictionary<string, UserRecord> users = new Dictionary<string, UserRecord>();

// Don't forget to use 'using' where appropriate
using (TextReader userfile = File.OpenText(userDataFile))
{
    string srcline;
    while ((srcline = userfile.ReadLine()) != null)
    {
        UserRecord user = UserRecord.Parse(line);
        if (user != null)
            users[user.Name] = user;
    }
}

然后,您可以通过用户名访问用户的数据,根据需要对其进行操作,并随时将其保存回来。

Dictionary用户中写回数据非常简单:

StringBuilder sb = new StringBuilder;
foreach (UserRecord user in users.Values) 
{
    sb.AppendFormat("{0}\n", user);
}
File.WriteAllText(userDataFile, sb.ToString());

同时,您有一个用户集合,可以保存以供将来检查和操作。

我仍然认为你应该使用数据库。它们并不难学,而且在这类事情上它们要好得多。

于 2013-06-06T23:22:04.530 回答
0

如果我正确理解您的问题,您需要移动

 File.WriteAllText(Server.MapPath("~") + "/App_Data/tuitterUsers.txt", newPasswordArray);

在循环之外,否则你在每个循环都重写文件,但这还不够,你还需要重建整个文本文件

 string fileToWrite = string.Join(Environment.NewLine, newPasswordArray);
 File.WriteAllText(Server.MapPath("~") + "/App_Data/tuitterUsers.txt", fileToWrite);

编辑:在代码更新和下面的评论之后
循环是完全错误的以及数组的重建

string userDataFile = Server.MapPath("~") + "/App_Data/tuitterUsers.txt";
string[] userDataArray = File.ReadAllLines(userDataFile);
for(int x = 0; x < userDataArray.Length; x++)
{
    string[] info = userData[x].Split(' ');
    if(Session["Username"].ToString() == info[0])
    {
        userData[x] = string.Join(" ",  Session["UserName"].ToString(),
                                        newPasswordTextBox.Text,
                                        avatarDropDownList.SelectedValue.ToString());
        break;
    }
}
string fileToWrite = string.Join(Environment.NewLine, userDataArray);
File.WriteAllText(Server.MapPath("~") + "/App_Data/tuitterUsers.txt", fileToWrite);

请记住,这适用于有限数量的用户
如果你很幸运,并且你的网站变成了新的 Twitter,你就不会想到使用一种在内存中读取所有用户姓名的解决方案。

于 2013-06-05T22:41:47.970 回答