基本上我试图为我的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);
答案 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());
同时,您有一个用户集合,您可以保存以供将来检查和操作。
我仍然认为你应该使用数据库。他们并不难学,而且他们对这类事情要好得多。