如何让 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();