使用c#更改.txt文件中的文本

时间:2013-06-05 22:34:16

标签: c#

基本上我试图为我的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);

2 个答案:

答案 0 :(得分: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,您就无法想到使用一种解决方案,在内存中读取所有用户的名称。

答案 1 :(得分:0)

首先,你所做的是一个坏主意™。鉴于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());

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

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