C# 如何仅为正确的用户更改存储在文本文件中的用户名和密码
我目前正在申请我的a级计算机课程。对于我的课程作业,我需要建立一个登录和注册系统,该系统要求我将用户详细信息存储在一个文本文件中。这仅适用于我的课程作业,因此安全性非常重要。我的注册和登录系统工作正常,但我还需要有一个更改帐户详细信息屏幕,用户可以在其中更改用户名和密码 我的问题是,我目前使用的代码更改了每个具有相同密码的用户的密码,即如果两个用户都使用password123作为密码,则他们的PasswordD都会更改为新密码C# 如何仅为正确的用户更改存储在文本文件中的用户名和密码,c#,text-files,C#,Text Files,我目前正在申请我的a级计算机课程。对于我的课程作业,我需要建立一个登录和注册系统,该系统要求我将用户详细信息存储在一个文本文件中。这仅适用于我的课程作业,因此安全性非常重要。我的注册和登录系统工作正常,但我还需要有一个更改帐户详细信息屏幕,用户可以在其中更改用户名和密码 我的问题是,我目前使用的代码更改了每个具有相同密码的用户的密码,即如果两个用户都使用password123作为密码,则他们的PasswordD都会更改为新密码 private void btnUpdatePassword_Cl
private void btnUpdatePassword_Click(object sender, EventArgs e)
{
string oldusername = txtBoxOldUsername.Text;
string newusername = txtBoxNewUsername.Text;
string oldpassword = txtBoxOldPassword.Text;
string newpassword = txtBoxNewPassword.Text;
string text = File.ReadAllText("users.txt");
text = text.Replace(oldpassword, newpassword).Replace(oldusername, newusername);
File.WriteAllText("users.txt", text);
}
我的问题是,我不知道如何只为正确的用户更改密码。如果有人能帮忙就太好了谢谢。我还必须使用一个文本文件来实现这一点,这意味着我不能在xml上使用jason等
这就是我的文本文件的外观
第一个用户~username~密码
第二个用户~username123~密码
第三个用户~username1234~密码
这是我用来写入文本文件的代码
FileStream fileStream = new FileStream("users.txt", FileMode.Append, FileAccess.Write);
StreamWriter streamWriter = new StreamWriter(fileStream);
try
{
streamWriter.WriteLine(fullname + "~" + username + "~" + password + "~" + lastlogin);
MessageBox.Show("User registered successfully", "Registration Successful");
this.Hide();
var homeForm = new HomeForm();
homeForm.Closed += (s, args) => this.Close();
homeForm.Show();
}
catch (Exception)
{
MessageBox.Show("Error registering the user", "Please try again");
}
finally
{
streamWriter.Close();
fileStream.Close();
}
您可以在保存密码时将用户名与密码一起存储,在从密码中提取用户名时删除用户名,在添加密码时添加用户名。 例如:
private void btnUpdatePassword_Click(object sender, EventArgs e)
{
string oldusername = txtBoxOldUsername.Text;
string newusername = txtBoxNewUsername.Text;
string oldpassword = txtBoxOldPassword.Text;
string newpassword = txtBoxNewPassword.Text;
string text = File.ReadAllText("users.txt");
text = text.Replace(oldpassword + oldusername, newpassword + newusername).Replace(oldusername, newusername);
File.WriteAllText("users.txt", text);
}
根据你更新的OP
string str = System.IO.File.ReadAllText(fileName);
var users = str.Split(new []{Environment.NewLine},StringSplitOptions.RemoveEmptyEntries)
.Select(x=>
{
var strArray = x.Split(new []{"~"},StringSplitOptions.RemoveEmptyEntries);
return new
{
FirstName = strArray[0],
User = strArray[1],
Password = strArray[2]
};
}
);
var usernameToUpdate = "username123";
var newPassword = "Thisisnewpassword";
var updatedList = users.Select(x => x.User.Equals(usernameToUpdate) ?
$"{x.FirstName} ~{x.User}~{newPassword}"
: $"{x.FirstName} ~{x.User}~{x.Password}").ToList();
var newFileData = String.Join(Environment.NewLine,
updatedList);
File.WriteAllText(fileName, newFileData);
下面是一个如何实现它的想法。我的第一个建议是在文本文件中添加一个逗号消除器,这样users.txt中的值将采用以下形式
second user~username123~password,
third user~username1234~password,
first user~username~smelly,
一次从users.txt导入所有用户,并通过我们的删除器“,”将其拆分
var users = File.ReadAllText(@"C:\users.txt").Split(',').ToList().Where(x=> !String.IsNullOrWhiteSpace(x));
注意此子句。其中(x=>!String.IsNullOrWhiteSpace(x
)是必需的,因为当我重写文件时,为了简单起见,我在每个条目中添加了一个逗号。由于最后一个条目将有一个逗号,我们将得到一个额外的空对象。此子句将纠正此错误
创建一个包含所有用户属性的类:
private class User
{
public string Name { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string PrepareForFile()
{
return Name + "~" + UserName + "~" + Password + ",";
}
}
循环浏览文件中检索到的所有用户信息,并生成用户列表:
List<User> myUsers = new List<User>();
foreach (var user in users)
{
var information = user.Split('~');
User temp = new User();
temp.Name = information[0].Trim();
temp.UserName = information[1].Trim();
temp.Password = information[2].Trim();
myUsers.Add(temp);
}
将用户名1234密码从“password”更改为“AlexLeo”:
以前
之后
您的文本文件分隔符是什么?请将您的文件附加到需要存储用户名和密码的问题上。我该怎么做?这似乎仍然有效?我必须编辑我的注册用户codestreamWriter.WriteLine中的内容吗(全名+“~”+用户名,密码+“~”+上次登录);@或至少一个带有密码的文件示例我已使用“我的用户”文本文件如何存储用户的示例更新我的问题details@jamesporiam已经更新了答案,请检查并让我知道
static class Program
{
private class User
{
public string Name { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string PrepareForFile()
{
return Name + "~" + UserName + "~" + Password + ",";
}
}
static void Main(string[] args)
{
var users = File.ReadAllText(@"C:\users.txt").Split(',').ToList().Where(x=> !String.IsNullOrWhiteSpace(x));
List<User> myUsers = new List<User>();
foreach (var user in users)
{
var information = user.Split('~');
User temp = new User();
temp.Name = information[0].Trim();
temp.UserName = information[1].Trim();
temp.Password = information[2].Trim();
myUsers.Add(temp);
}
var selectedUser = myUsers.Where(x => x.UserName == "username").SingleOrDefault();
myUsers.Remove(selectedUser);
selectedUser.Password = "Leo";
myUsers.Add(selectedUser);
List<string> formatForFile = new List<string>();
foreach(var item in myUsers)
{
formatForFile.Add(item.PrepareForFile());
}
File.WriteAllLines(@"C:\users.txt", formatForFile.ToArray());
}
}