Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何仅为正确的用户更改存储在文本文件中的用户名和密码_C#_Text Files - Fatal编程技术网

C# 如何仅为正确的用户更改存储在文本文件中的用户名和密码

C# 如何仅为正确的用户更改存储在文本文件中的用户名和密码,c#,text-files,C#,Text Files,我目前正在申请我的a级计算机课程。对于我的课程作业,我需要建立一个登录和注册系统,该系统要求我将用户详细信息存储在一个文本文件中。这仅适用于我的课程作业,因此安全性非常重要。我的注册和登录系统工作正常,但我还需要有一个更改帐户详细信息屏幕,用户可以在其中更改用户名和密码 我的问题是,我目前使用的代码更改了每个具有相同密码的用户的密码,即如果两个用户都使用password123作为密码,则他们的PasswordD都会更改为新密码 private void btnUpdatePassword_Cl

我目前正在申请我的a级计算机课程。对于我的课程作业,我需要建立一个登录和注册系统,该系统要求我将用户详细信息存储在一个文本文件中。这仅适用于我的课程作业,因此安全性非常重要。我的注册和登录系统工作正常,但我还需要有一个更改帐户详细信息屏幕,用户可以在其中更改用户名和密码

我的问题是,我目前使用的代码更改了每个具有相同密码的用户的密码,即如果两个用户都使用password123作为密码,则他们的PasswordD都会更改为新密码

 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());
        }
    }