找不到 txt 文件 StreamReader
Cannot find txt file StreamReader
'未处理的异常:
System.IO.FileNotFoundException: 找不到文件“/Logins.txt”'
你好,新手在 xamarin c# 中制作了一个非常基本的 login/signup 系统,它使用 Systsem.IO 中的 StreamReader 来读取包含存储的用户名和密码的文本文件。 txt 文件与 .cs 文件位于同一目录中,并且在解决方案资源管理器中可见。
我尝试输入完整路径但没有成功,并且 运行 作为管理员以防万一它与权限有关。
有什么问题吗?
public partial class LoginPage : ContentPage
{
public LoginPage()
{
InitializeComponent();
}
List<string> user = new List<string>();
List<string> pass = new List<string>();
public void btnLogin_Clicked(object sender, EventArgs e)
{
//Read the txt
StreamReader sr = new StreamReader("Logins.txt");
string line = "";
//Read every line until there is nothing in the next line
while ((line = sr.ReadLine()) != null)
{
//Grab items within new lines separated by a space and chuck them into their array
string[] components = line.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
user.Add(components[0]);
pass.Add(components[0]);
}
//Check entries are on the same line and match
if (user.Contains(txtUsername.Text) && pass.Contains(txtPassword.Text) && Array.IndexOf(user.ToArray(), txtUsername.Text) == Array.IndexOf(pass.ToArray(), txtPassword.Text))
{
Navigation.PushModalAsync(new HomeScreen());
}
else
DisplayAlert("Error", "The username or password you have entered is incorrect", "Ok");
}
private void Cancel_Clicked(object sender, EventArgs e)
{
Navigation.PushModalAsync(new MainPage());
}
}
如果将 Logins.txt
文件更改为嵌入式资源,则可以在运行时从程序集中加载该资源,如下所示:
var assembly = IntrospectionExtensions.GetTypeInfo(typeof(LoginPage)).Assembly;
Stream stream = assembly.GetManifestResourceStream("YourAssembly.Logins.txt");
string text = "";
using (var reader = new System.IO.StreamReader (stream))
{
text = reader.ReadToEnd();
}
YouAssembly
是指在您构建项目时将生成的程序集 (dll) 的名称。如果您不知道这是什么,或者没有更改它,它可能与项目同名。
Xamarin 文档有一个很好的例子来说明如何做到这一点:File Handling in Xamarin.Forms
编辑:
在构造函数中执行此操作的更完整示例,和 处理内容以便您可以进行身份验证处理。
但首先,让我们定义一个 POCO 来保存用户名/密码详细信息:
public class UserCredentials
{
public string Username {get;set;}
public string Password {get;set;}
}
添加一个 属性 以将此保存到 class:
List<UserCredentials> CredentialList {get;set;}
现在,在构造函数中:
public LoginPage()
{
InitializeComponent();
// Read in the content of the embedded resource, but let's read
// each line to make processing a little easier
var assembly = IntrospectionExtensions.GetTypeInfo(typeof(LoginPage)).Assembly;
Stream stream = assembly.GetManifestResourceStream("YourAssembly.Logins.txt");
var textLines = new List<string>();
string line = null;
using (var reader = new System.IO.StreamReader (stream))
{
while ((line = sr.ReadLine()) != null)
{
textLines.Add(line);
}
}
// Init our cred list
this.CredentialList = new List<UserCredentials>();
// Read out the contents of the username/password combinations
foreach (var line in textLines)
{
// Grab items within new lines separated by a space and chuck them into their array
string[] components = line.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);
// Add the combination to our list
this.CredentialList.Add(new UserCredential
{
Username = user.Add(components[0]),
Password = pass.Add(components[0])
});
}
}
现在我们的登录变得容易多了。以前我们首先检查用户名/密码是否都存在于我们已知的数据集中,然后检查它们是否在两个列表中的相同索引处。
public void btnLogin_Clicked(object sender, EventArgs e)
{
// Now can use linq to validate the user
// NOTE: this is case sensitive
if (this.CredentialList.Any(a => a.Username == txtUsername.Text && a.Password == txtPassword.Text))
{
// NOTE: you've only validated the user here, but aren't passing
// or storing any detail of who the currently logged in user is
Navigation.PushModalAsync(new HomeScreen());
}
else
{
DisplayAlert("Error", "The username or password you have entered is incorrect", "Ok");
}
}
'未处理的异常:
System.IO.FileNotFoundException: 找不到文件“/Logins.txt”'
你好,新手在 xamarin c# 中制作了一个非常基本的 login/signup 系统,它使用 Systsem.IO 中的 StreamReader 来读取包含存储的用户名和密码的文本文件。 txt 文件与 .cs 文件位于同一目录中,并且在解决方案资源管理器中可见。 我尝试输入完整路径但没有成功,并且 运行 作为管理员以防万一它与权限有关。 有什么问题吗?
public partial class LoginPage : ContentPage
{
public LoginPage()
{
InitializeComponent();
}
List<string> user = new List<string>();
List<string> pass = new List<string>();
public void btnLogin_Clicked(object sender, EventArgs e)
{
//Read the txt
StreamReader sr = new StreamReader("Logins.txt");
string line = "";
//Read every line until there is nothing in the next line
while ((line = sr.ReadLine()) != null)
{
//Grab items within new lines separated by a space and chuck them into their array
string[] components = line.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
user.Add(components[0]);
pass.Add(components[0]);
}
//Check entries are on the same line and match
if (user.Contains(txtUsername.Text) && pass.Contains(txtPassword.Text) && Array.IndexOf(user.ToArray(), txtUsername.Text) == Array.IndexOf(pass.ToArray(), txtPassword.Text))
{
Navigation.PushModalAsync(new HomeScreen());
}
else
DisplayAlert("Error", "The username or password you have entered is incorrect", "Ok");
}
private void Cancel_Clicked(object sender, EventArgs e)
{
Navigation.PushModalAsync(new MainPage());
}
}
如果将 Logins.txt
文件更改为嵌入式资源,则可以在运行时从程序集中加载该资源,如下所示:
var assembly = IntrospectionExtensions.GetTypeInfo(typeof(LoginPage)).Assembly;
Stream stream = assembly.GetManifestResourceStream("YourAssembly.Logins.txt");
string text = "";
using (var reader = new System.IO.StreamReader (stream))
{
text = reader.ReadToEnd();
}
YouAssembly
是指在您构建项目时将生成的程序集 (dll) 的名称。如果您不知道这是什么,或者没有更改它,它可能与项目同名。
Xamarin 文档有一个很好的例子来说明如何做到这一点:File Handling in Xamarin.Forms
编辑:
在构造函数中执行此操作的更完整示例,和 处理内容以便您可以进行身份验证处理。
但首先,让我们定义一个 POCO 来保存用户名/密码详细信息:
public class UserCredentials
{
public string Username {get;set;}
public string Password {get;set;}
}
添加一个 属性 以将此保存到 class:
List<UserCredentials> CredentialList {get;set;}
现在,在构造函数中:
public LoginPage()
{
InitializeComponent();
// Read in the content of the embedded resource, but let's read
// each line to make processing a little easier
var assembly = IntrospectionExtensions.GetTypeInfo(typeof(LoginPage)).Assembly;
Stream stream = assembly.GetManifestResourceStream("YourAssembly.Logins.txt");
var textLines = new List<string>();
string line = null;
using (var reader = new System.IO.StreamReader (stream))
{
while ((line = sr.ReadLine()) != null)
{
textLines.Add(line);
}
}
// Init our cred list
this.CredentialList = new List<UserCredentials>();
// Read out the contents of the username/password combinations
foreach (var line in textLines)
{
// Grab items within new lines separated by a space and chuck them into their array
string[] components = line.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);
// Add the combination to our list
this.CredentialList.Add(new UserCredential
{
Username = user.Add(components[0]),
Password = pass.Add(components[0])
});
}
}
现在我们的登录变得容易多了。以前我们首先检查用户名/密码是否都存在于我们已知的数据集中,然后检查它们是否在两个列表中的相同索引处。
public void btnLogin_Clicked(object sender, EventArgs e)
{
// Now can use linq to validate the user
// NOTE: this is case sensitive
if (this.CredentialList.Any(a => a.Username == txtUsername.Text && a.Password == txtPassword.Text))
{
// NOTE: you've only validated the user here, but aren't passing
// or storing any detail of who the currently logged in user is
Navigation.PushModalAsync(new HomeScreen());
}
else
{
DisplayAlert("Error", "The username or password you have entered is incorrect", "Ok");
}
}