如何使流编写器在同一文件夹 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();
        }
    }
}

如何使流编写器在同一文件夹 C# .NET 中写入新文件

当您的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();