как изменить имя пользователя и пароль, хранящиеся в текстовом файле только для правильного пользователя - PullRequest
0 голосов
/ 12 января 2019

В настоящее время я подаю заявку на курс по вычислению уровня. для моей курсовой работы мне необходимо создать систему входа в систему и регистрации, которая потребует от меня сохранения пользовательских данных в текстовом файле, это только для моей курсовой работы, поэтому безопасность очень важна. Моя система регистрации и входа в систему работает нормально, но мне также необходимо иметь экран для изменения данных учетной записи, на котором пользователь может изменить свое имя пользователя и пароль.

моя проблема в том, что мой код, который у меня есть, меняет пароль для каждого пользователя с одним и тем же паролем, то есть если у 2 пользователей пароль123 в качестве пароля, и их пароли меняются на новый пароль

 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 и т. д.

так выглядит мой текстовый файл

первый пользователь ~ имя пользователя ~ пароль

второй пользователь ~ 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();
                        }

Ответы [ 3 ]

0 голосов
/ 12 января 2019

На основе вашего обновленного ОП

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);
0 голосов
/ 12 января 2019

Вот идея о том, как это реализовать. Мое первое предложение - добавить разделитель запятых в ваш текстовый файл, чтобы ваши значения в 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));

Примечание этот пункт .Where(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);
        }

Теперь у вас есть управляемая структура, и вы можете выполнять все необходимые операции. После завершения используйте метод PrepareForFile (), чтобы создать строку типа second user~username123~password для записи в файл.

Собираем все вместе (это консольное приложение):

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

Изменение пароля username1234 с «password» на «AlexLeo»:

До

enter image description here

После

enter image description here

0 голосов
/ 12 января 2019

Вы можете сохранить имя пользователя с паролем при сохранении пароля и удалить имя пользователя при его извлечении из пароля, а также добавить имя пользователя при добавлении пароля. например:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...