如何让 streamWriter 在同一文件夹 C# .NET 中写入新文件
How do I make the streamWriter write a new file in the same folder C# .NET
我有 3 个表格.. 我只用了 2 个。
registerForm、loginForm 和 mainForm。
这就是一切的设置方式。
应用程序打开并使用登录表单提示用户 > 用户可以登录现有帐户或按注册 > 用户登录 > streamWriter 使用用户名和密码创建一个文本文件 > 文本文件存储在
("C:\" + regUsernametextBox.Text + "\infoBox.creds")。请记住,("infoBox.creds") 只是我所做的扩展。
用户可以在名为 textBox1 的 mainForm 的文本框中键入内容
我希望 streamWriter 将 textBox1 内内容的文本文件写入与用户凭据所在的文件夹相同的文件夹中。
例子
我创建了一个名为 Tom 的用户 > 应用程序创建了一个名为 Tom 的文件夹,其中包含一个文本文件,该文本文件包含用户的用户名和密码。
当登录的用户在 textBox1 中写入一些内容时,我希望它将该文本保存到另一个文本文件中,但位于与 "Tom" 文件夹相同的文件夹中。
我试过的
我所做的(正如您在下面看到的)是我尝试从登录表单中存储用户名的值,并尝试在我的主表单中使用该值
Giving the file a name
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 的信息写入文本文件。
我希望我能很好地描述我的问题,并感谢任何可能的帮助!
mainForm Code
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");
}
loginForm Code
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;
}
}
}
registerForm Code
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();
您创建了一个新的 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
的结束事件中使用它。
我还建议使用 "using" 块。
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();
我有 3 个表格.. 我只用了 2 个。 registerForm、loginForm 和 mainForm。
这就是一切的设置方式。
应用程序打开并使用登录表单提示用户 > 用户可以登录现有帐户或按注册 > 用户登录 > streamWriter 使用用户名和密码创建一个文本文件 > 文本文件存储在 ("C:\" + regUsernametextBox.Text + "\infoBox.creds")。请记住,("infoBox.creds") 只是我所做的扩展。
用户可以在名为 textBox1 的 mainForm 的文本框中键入内容
我希望 streamWriter 将 textBox1 内内容的文本文件写入与用户凭据所在的文件夹相同的文件夹中。
例子
我创建了一个名为 Tom 的用户 > 应用程序创建了一个名为 Tom 的文件夹,其中包含一个文本文件,该文本文件包含用户的用户名和密码。
当登录的用户在 textBox1 中写入一些内容时,我希望它将该文本保存到另一个文本文件中,但位于与 "Tom" 文件夹相同的文件夹中。
我试过的
我所做的(正如您在下面看到的)是我尝试从登录表单中存储用户名的值,并尝试在我的主表单中使用该值
Giving the file a name
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 的信息写入文本文件。
我希望我能很好地描述我的问题,并感谢任何可能的帮助!
mainForm Code
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");
}
loginForm Code
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;
}
}
}
registerForm Code
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();
您创建了一个新的 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
的结束事件中使用它。
我还建议使用 "using" 块。
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();