c# - 如何遍历文件以获取数据?
问题描述
我正在尝试进行基本登录并注册 c# 控制台应用程序,但是,我需要遍历我的文件以查看用户在登录时输入的用户名和密码是否匹配。如果用户输入用户名和密码,我希望我的代码通过我的文件来检查它是否是现有的用户名和密码
这是我的代码:
[Serializable]
public class Users
{
public string UserName;
public string Password;
public Users(string userName, string password)
{
UserName = userName;
Password = password;
}
}
public class SaveToFile
{
public static void SerializeSignUpDetails(string userName, string password)
{
Users obj = new Users(userName, password);
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("SignUp.txt", FileMode.Append, FileAccess.Write);
formatter.Serialize(stream, obj);
stream.Close();
}
public static Users DeserializeSignUpDetails()
{
Stream stream = new FileStream("SignUp.txt", FileMode.Open, FileAccess.Read);
IFormatter formatter = new BinaryFormatter();
Users objnew = (Users)formatter.Deserialize(stream);
stream.Close();
return objnew;
}
}
public static void Main(string[] args)
{
Console.WriteLine("To Login Type 1, To Create a new account Type 2");
int LogInOrSignUp;
do
{
int.TryParse(Console.ReadLine(), out LogInOrSignUp);
} while (LogInOrSignUp != 1 && LogInOrSignUp != 2);
string userName = "";
string password = "";
bool successfull = false;
Users userDetails = SaveToFile.DeserializeSignUpDetails();
while (!successfull)
{
if (LogInOrSignUp == 1)
{
Console.WriteLine("Write your username:");
userName = Console.ReadLine();
Console.WriteLine("Enter your password:");
password = Console.ReadLine();
if (userName == userDetails.UserName && password == userDetails.Password)
{
Console.WriteLine("You have logged in successfully!");
successfull = true;
break;
}
if (!successfull)
{
Console.WriteLine("Your username or password is incorect, try again!");
}
}
else if (LogInOrSignUp == 2)
{
Console.WriteLine("Enter a username:");
userName = Console.ReadLine();
Console.WriteLine("Enter a password:");
password = Console.ReadLine();
successfull = true;
SaveToFile.SerializeSignUpDetails(userName, password);
}
}
}
我想使用 foreach 来循环我的文件,但我不确定如何。
任何帮助表示赞赏!
解决方案
要使用序列化保留多个条目的登录记录,您需要序列化对象列表。在您的情况下,您可以创建几个可序列化的类,User
封装单个条目的数据的Users
类,以及包含List<User>
对象和数据操作方法的类。
✔ 注意:您喜欢的名称。
◉要导入的命名空间
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
◉用户类_
[Serializable]
public class User
{
public string UserName { get; set; }
public string Password { get; set; }
//More details...
public User(string userName, string password)
{
UserName = userName;
Password = password;
}
public override string ToString() => $"{UserName}, {Password}";
}
◉用户类_
[Serializable]
public class Users
{
public readonly List<User> Accounts;
public Users() => Accounts = new List<User>();
public void Save(string filePath)
{
if (string.IsNullOrEmpty(filePath)) return;
var bf = new BinaryFormatter();
using (var fs = new FileStream(filePath, FileMode.Create))
bf.Serialize(fs, this);
}
public static Users Load(string filePath)
{
if (!File.Exists(filePath)) return null;
var bf = new BinaryFormatter();
using (var sr = new FileStream(filePath, FileMode.Open))
return bf.Deserialize(sr) as Users;
}
public bool ContainsUserName(string userName) =>
Accounts.Any(x => x.UserName == userName);
public bool ContainsAccount(string userName, string pass) =>
Accounts.Any(x => x.UserName == userName && x.Password == pass);
public User Get(string userName, string pass) =>
Accounts.FirstOrDefault(x => x.UserName == userName && x.Password == pass);
public bool Add(string userName, string pass)
{
if (ContainsUserName(userName)) return false;
Accounts.Add(new User(userName, pass));
return true;
}
}
在您的实现中,创建、加载和保存数据:
//Load...
users = Users.Load(dataFilePath);
//Or create new object...
if (users is null)
users = new Users();
//and when it comes to save...
users.Save(dataFilePath);
使用该ContainsUserName
方法找出给定的用户名是否已经存在,这样您就可以避免重复。该Add
方法将执行相同的操作,并且会将有效的新条目添加到列表中。该Get
方法在列表中搜索给定的用户名和密码,User
如果有,则返回一个对象,如果您不需要返回一个对象null
,该方法将执行相同的操作。ContainsAccount
User
var user = users.Get("user", "pass");
if (user is null)
Console.WriteLine("Incorrect username and/or password...");
//or
if (!users.ContainsAccount("user", "pass"))
Console.WriteLine("Incorrect username and/or password...");
将其应用于您的main
:
public static void Main(string[] args)
{
Console.WriteLine("To Login Type 1, To Create a new account Type 2");
int LogInOrSignUp;
do
{
int.TryParse(Console.ReadLine(), out LogInOrSignUp);
} while (LogInOrSignUp != 1 && LogInOrSignUp != 2);
var filePath = Path.Combine(AppContext.BaseDirectory, "SignUp.dat");
var userName = "";
var password = "";
var successfull = false;
var userDetails = Users.Load(filePath);
if (userDetails is null)
userDetails = new Users();
while (!successfull)
{
if (LogInOrSignUp == 1)
{
Console.WriteLine("Write your username:");
userName = Console.ReadLine();
Console.WriteLine("Enter your password:");
password = Console.ReadLine();
if (userDetails.ContainsAccount(userName, password))
{
Console.WriteLine("You have logged in successfully!");
successfull = true;
break;
}
else
Console.WriteLine("Your username or password is incorect, try again!");
}
else //if (LogInOrSignUp == 2)
{
Console.WriteLine("Enter a username:");
userName = Console.ReadLine();
if (userDetails.ContainsUserName(userName))
Console.WriteLine("The username is taken. Try another one.");
else
{
Console.WriteLine("Enter a password:");
password = Console.ReadLine();
successfull = true;
userDetails.Add(userName, password);
userDetails.Save(filePath);
Console.WriteLine($"A new account for {userName} has been created.");
}
}
}
Console.ReadLine();
}
✔ 注意:最好使用switch语句来选择LogInOrSignUp
而不是if
语句
推荐阅读
- swift - WKWebView 运行网站桌面版 - Swift
- c# - Razor 布局视图上的 MVC 身份检查身份验证
- python - 如何在 x 轴中设置月份名称以在 python 中绘制时间戳数据?
- python - 设置 LANGUAGES 时,SECRET_KEY 设置不能为空
- python - 为什么验证准确性在各个时期没有以正常方式增加?
- python - pytorch中if-else语句和torch.where有什么区别?
- python - 喜欢和评论部分:在 django
- python - 有没有办法使用 pyspark 在 SNOWflake 中使用 DML 操作,能够运行 select 语句但在合并或创建语句中遇到问题
- typescript - 在 Firebase 云函数中分配之前使用变量 userFetched
- ios - iTunes Sandbox 帐户不断询问未登录帐户的密码