如何使流编写器在同一文件夹 C# .NET 中写入新文件
本文关键字:新文件 文件 NET 文件夹 何使流 | 更新日期: 2023-09-27 17:56:54
我有3种形式。我只使用2个。注册窗体、登录窗体和主窗体。
这就是一切的设置方式。
应用程序打开并使用登录表单提示用户>用户可以登录到现有帐户或按注册>用户登录> streamWriter 使用用户用户名和密码创建一个文本文件>文本文件存储在("C:''" + regUsernametextBox.Text + "''infoBox.creds")。请记住,("infoBox.creds")只是我做的扩展。
用户可以在mainForm的文本框中键入内容,称为textBox1
我希望 streamWriter 将 textBox1 内部内容的文本文件写入与用户凭据相同的文件夹中。
例
我创建了一个名为 Tom> 应用程序创建一个名为 Tom 的文件夹,其中包含一个文本文件,该文本文件包含用户的用户名和密码。
当登录的用户在textBox1中写入某些内容时,我希望它将该文本保存到另一个文本文件中,但位于"Tom"文件夹的同一文件夹中。
我试过什么
我所做的(如下所示)是我尝试从登录表单存储用户名的值,并尝试在我的主表单中使用该值
为文件命名
var streamWrite = new System.IO.StreamWriter("C:''" + loginFrm.folderName + "''Conent.info");
然后将值存储在其中
System.IO.Directory.CreateDirectory("C:''" + loginFrm.folderName);
var streamWrite = new System.IO.StreamWriter("C:''" + loginFrm.folderName + "''Conent.info");
streamWrite.Write(textboxContent);
但它不会编写一个文本文件,其中包含在 mainForm 中提供给 textBox1 的信息。
我希望我很好地描述了我的问题,并感谢任何可能的帮助!
主窗体代码
public partial class mainForm : MetroForm
{
public mainForm()
{
InitializeComponent();
}
public string textboxContent;
private void Form1_Load(object sender, EventArgs e)
{
textbox1.Text = Properties.Settings.Default.SavedText;
loginForm loginFrm = new loginForm();
loginFrm.Hide();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
loginForm loginFrm = new loginForm();
textboxContent = textbox1.Text;
try
{
var streamWrite = new System.IO.StreamWriter("C:''" + loginFrm.folderName + "''Conent.info");
streamWrite.Write(textboxContent);
streamWrite.Close();
}
catch(System.IO.DirectoryNotFoundException ex)
{
System.IO.Directory.CreateDirectory("C:''" + loginFrm.folderName);
var streamWrite = new System.IO.StreamWriter("C:''" + loginFrm.folderName + "''Conent.info");
streamWrite.Write(textboxContent);
streamWrite.Close();
MessageBox.Show("Nope");
}
登录表单代码
public loginForm()
{
InitializeComponent();
}
public string username, password;
public string folderName;
private void button1_Click(object sender, EventArgs e)
{
try
{
folderName = username;
var sr = new System.IO.StreamReader("C:''" + regUsernametextBox.Text + "''infoBox.creds");
username = sr.ReadLine();
password = sr.ReadLine();
sr.Close();
if(username == regUsernametextBox.Text && password == regPasswordTextBox.Text)
{
MessageBox.Show("You have successfully logged in", "Authorize");
loginForm regFrm = new loginForm();
this.Hide();
mainForm mainFrm = new mainForm();
mainFrm.ShowDialog();
this.Show();
}
else
{
MessageBox.Show("Please make sure you typed int he correct name and password", "Authorize Error!");
}
}
catch(System.IO.DirectoryNotFoundException ex)
{
MessageBox.Show("The user does not exist","Error");
}
}
private void button2_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void registerLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
registerForm regFrm = new registerForm();
regFrm.Visible = true;
}
}
}
注册表单代码
public registerForm()
{
InitializeComponent();
}
private void registerForm_Load(object sender, EventArgs e)
{
}
private void registerButton_Click(object sender, EventArgs e)
{
try
{
var sw = new System.IO.StreamWriter("C:''" + regUsernametextBox.Text + "''infoBox.creds");
sw.Write(regUsernametextBox.Text + "'n" + regPasswordTextBox.Text);
sw.Close();
}
catch(System.IO.DirectoryNotFoundException ex)
{
System.IO.Directory.CreateDirectory("C:''" + regUsernametextBox.Text);
var sw = new System.IO.StreamWriter("C:''" + regUsernametextBox.Text + "''infoBox.creds");
sw.Write(regUsernametextBox.Text + "'n" + regPasswordTextBox.Text);
MessageBox.Show("Account successfully created!","Account");
sw.Close();
}
}
private void button2_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
当您的mainForm
关闭时
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
loginForm loginFrm = new loginForm();
您创建一个新的登录表单,该表单为空,值loginFrm.folderName
应为null
或空字符串(我没有看到loginForm
的构造函数)。
您需要带有输入数据的loginForm
的原始引用,或者至少是folderName
.
因此,在您的mainForm
创建一个可以捕获文件夹名称的变量
public partial class mainForm : MetroForm
{
public string User_folder_Name;
当您调用loginForm
传递中的mainForm
时,首先该值:
mainForm mainFrm = new mainForm();
mainFrm.User_folder_Name = folderName;
mainFrm.ShowDialog();
现在您可以在mainForm
的闭幕事件中使用它。我还建议使用"使用"块。
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
loginForm loginFrm = new loginForm();
textboxContent = textbox1.Text;
// Path.Combine is a conmfortable tool to create paths
string completeFolderPath = Path.Combine(@"C:'", User_folder_Name);
string completeFIlePath = Path.Combine(completeFolderPath, "Conent.info");
using (StreamWriter writer = new StreamWriter(completeFIlePath))
{ // check whether the directory exists and create on if NOT
if (!Directory.Exists(completeFolderPath))
{
Directory.CreateDirectory(completeFolderPath);
MessageBox.Show("Directory created");
}
// write the content
streamWrite.Write(textboxContent);
}
}
编辑:
在你的loginForm
你有三个变量
public string username, password;
public string folderName;
使用 new
关键字创建表单时。所有这些值在开始时都是null
的,因为您没有为它们显式分配值。
在按钮单击事件中,您可以执行以下操作:
folderName = username;
这基本上是将一个null
的变量分配给另一个同样null
的变量。所以结果是null
然后读取文件时,您只填充username
但该值永远不会传递给foldername
,这仍然是null
。
请交换两行的顺序。 像这样:
var sr = new System.IO.StreamReader("C:''" + regUsernametextBox.Text + "''infoBox.creds");
username = sr.ReadLine();
password = sr.ReadLine();
folderName = username;
sr.Close();