C# 如何循环文件以获取数据?
我正在尝试进行基本登录并注册c#console应用程序,但是,我需要在文件中循环,以查看用户在登录时输入的用户名和密码是否匹配。如果用户输入用户名和密码,我希望我的代码通过我的文件检查它是否是现有的用户名和密码 这是我的密码:C# 如何循环文件以获取数据?,c#,serialization,foreach,binaryformatter,binary-serialization,C#,Serialization,Foreach,Binaryformatter,Binary Serialization,我正在尝试进行基本登录并注册c#console应用程序,但是,我需要在文件中循环,以查看用户在登录时输入的用户名和密码是否匹配。如果用户输入用户名和密码,我希望我的代码通过我的文件检查它是否是现有的用户名和密码 这是我的密码: [可序列化] 公共类用户 { 公共字符串用户名; 公共字符串密码; 公共用户(字符串用户名、字符串密码) { 用户名=用户名; 密码=密码; } } 公共类保存文件 { 公共静态注册详细信息(字符串用户名、字符串密码) { Users obj=新用户(用户名、密码); I
[可序列化]
公共类用户
{
公共字符串用户名;
公共字符串密码;
公共用户(字符串用户名、字符串密码)
{
用户名=用户名;
密码=密码;
}
}
公共类保存文件
{
公共静态注册详细信息(字符串用户名、字符串密码)
{
Users obj=新用户(用户名、密码);
IFormatter formatter=新的BinaryFormatter();
Stream=新文件流(“SignUp.txt”,FileMode.Append,FileAccess.Write);
序列化(流,obj);
stream.Close();
}
公共静态用户反序列化SignupDetails()
{
Stream=新文件流(“SignUp.txt”,FileMode.Open,FileAccess.Read);
IFormatter formatter=新的BinaryFormatter();
Users objnew=(Users)格式化程序。反序列化(流);
stream.Close();
返回objnew;
}
}
公共静态void Main(字符串[]args)
{
WriteLine(“登录类型1,创建新帐户类型2”);
国际物流注册;
做
{
int.TryParse(Console.ReadLine(),out LogInOrSignUp);
}while(LogInOrSignUp!=1&&LogInOrSignUp!=2);
字符串userName=“”;
字符串密码=”;
bool successfull=false;
Users userDetails=SaveToFile.DeserializeSignUpDetails();
而(!成功)
{
如果(LogInOrSignUp==1)
{
Console.WriteLine(“写下您的用户名:”);
userName=Console.ReadLine();
Console.WriteLine(“输入密码:”);
password=Console.ReadLine();
if(userName==userDetails.userName&&password==userDetails.password)
{
WriteLine(“您已成功登录!”);
成功=正确;
打破
}
如果(!成功)
{
WriteLine(“您的用户名或密码不正确,请重试!”);
}
}
else if(LogInOrSignUp==2)
{
Console.WriteLine(“输入用户名:”);
userName=Console.ReadLine();
Console.WriteLine(“输入密码:”);
password=Console.ReadLine();
成功=正确;
SaveToFile.SerializeSignUpDetails(用户名、密码);
}
}
}
我想使用foreach循环浏览我的文件,但我不确定如何使用
感谢您的帮助 因为OP在一个文件中提供了有关多个凭据的详细信息。 最常见的方法是序列化。二进制或xml都可以 相关主题: 不过,版本兼容可能是您的下一个问题 也许能解决你的问题 ====== 假设文件夹中有一束txt文件 必须做两件事
反序列化SignupDetails
以获取文件路径
public static Users DeserializeSignUpDetails( string szPath)
{
Stream stream = new FileStream( szPath, FileMode.Open, FileAccess.Read);
IFormatter formatter = new BinaryFormatter();
Users objnew = (Users)formatter.Deserialize(stream);
stream.Close();
return objnew;
}
循环浏览文件并获取所有登录凭据。它可以放在主程序中
List<Users> GetAllLoginCredential()
{
List<Users> list = new List<Users>();
string[] files = Paths.GetFileName( "D:\\YourDirectory" );
foreach( var path in files ){
Users user = SaveToFile.DeserializeSignUpDetails( path );
list.Add( user );
}
}
List GetAllLoginCredential()
{
列表=新列表();
string[]files=path.GetFileName(“D:\\YourDirectory”);
foreach(文件中的var路径){
Users user=SaveToFile.DeserializeSignUpDetails(路径);
列表。添加(用户);
}
}
然后您可以检查每个用户。此外,您可能希望缓存它以防止重复打开文件
顺便说一下,
用户
只有一个用户信息,您可能希望它是用户
,因为OP在一个文件中提供了有关多个凭据的详细信息。
最常见的方法是序列化。二进制或xml都可以
相关主题:
不过,版本兼容可能是您的下一个问题
也许能解决你的问题
======
假设文件夹中有一束txt文件
必须做两件事
反序列化SignupDetails
以获取文件路径
public static Users DeserializeSignUpDetails( string szPath)
{
Stream stream = new FileStream( szPath, FileMode.Open, FileAccess.Read);
IFormatter formatter = new BinaryFormatter();
Users objnew = (Users)formatter.Deserialize(stream);
stream.Close();
return objnew;
}
循环浏览文件并获取所有登录凭据。它可以放在主程序中
List<Users> GetAllLoginCredential()
{
List<Users> list = new List<Users>();
string[] files = Paths.GetFileName( "D:\\YourDirectory" );
foreach( var path in files ){
Users user = SaveToFile.DeserializeSignUpDetails( path );
list.Add( user );
}
}
List GetAllLoginCredential()
{
列表=新列表();
string[]files=path.GetFileName(“D:\\YourDirectory”);
foreach(文件中的var路径){
Users user=SaveToFile.DeserializeSignUpDetails(路径);
列表。添加(用户);
}
}
然后您可以检查每个用户。此外,您可能希望缓存它以防止重复打开文件
顺便说一下,
用户
只有一个用户信息,您可能希望它是用户
您可能需要查看的几个点-
Users
更改为User
,因为这是User
的单一表示形式将文件中存储的所有用户转换为列表
,如下所示:
public static List<Users> DeserializeSignUpDetails()
{
List<Users> users = new List<Users>();
using (Stream stream = new FileStream(@"SignUp.txt", FileMode.Open, FileAccess.Read))
{
if (stream.Length != 0)
{
BinaryFormatter formatter = new BinaryFormatter();
while (stream.Position != stream.Length)
{
users.Add((Users)formatter.Deserialize(stream));
}
return users;
}
}
return users;
}
其他注意事项:
在读取流时使用以正确处理
在序列化/反序列化之前,检查流的Null
或empty
,以鼓励防御性编程-
if (stream.Length != 0)
你可能需要看几点-
将类名从Users
更改为User
,因为这是User
的单一表示形式
您可以转换