将数据从文本框写入文本文件

本文关键字:文本 文件 数据 | 更新日期: 2023-09-27 17:51:05

下面是我用来写入和读取文本文件的代码。

StreamWriter sw1 = new StreamWriter("DataNames.txt");
sw1.WriteLine(textBox1.Text);
sw1.Close();
StreamWriter sw2 = new StreamWriter("DataNumbers.txt");
sw2.WriteLine(textBox2.Text);
sw2.Close();
FileInfo file1 = new FileInfo("DataNames.txt");
StreamReader sr1 = file1.OpenText();
while (!sr1.EndOfStream)
{
    listBox1.Items.Add(sr1.ReadLine());
}
FileInfo file2 = new FileInfo("DataNumbers.txt");
StreamReader sr2 = file2.OpenText();
while (!sr2.EndOfStream)
{
    listBox2.Items.Add(sr2.ReadLine());
}

事情是,当我点击我的按钮保存数据从我的文本框到我的文本文件出现一个错误,说"进程无法访问文件'C:'xxxx'xxxxxx'xxxxx'xxxx'xxxxx'xxxxx 'xxxxx.txt',因为它正在被另一个进程使用。"

谁能告诉我为什么我有这个错误,也许可以帮助我修复它

将数据从文本框写入文本文件

尝试在流周围添加using语句以确保它们是Disposed,否则文件仍然被锁定到流

的例子:

   //Write
    using (StreamWriter sw1 = new StreamWriter("DataNames.txt"))
    {
        sw1.WriteLine(textBox1.Text);
    }
    using (StreamWriter sw2 = new StreamWriter("DataNumbers.txt"))
    {
        sw2.WriteLine(textBox2.Text);
    }

    // Read
    foreach (var line in File.ReadAllLines("DataNames.txt"))
    {
        listBox1.Items.Add(line);
    }
    foreach (var line in File.ReadAllLines("DataNumbers.txt"))
    {
        listBox2.Items.Add(line);
    }

您在读完文件后似乎没有关闭它。调用FileInfo之后。OpenText你得到一个必须关闭的StreamReader,要么通过Close方法,要么更好,用using语句。

但是已经有一些方法为你做了所有这些,看看File。WriteAllText,文件。AppendAllText和File。ReadAllLines方法。

当您不再需要StreamReader对象时,您需要关闭它。这应该可以解决这个问题。例如

StreamReader sr1 = file1.OpenText();
try {
            while (!sr1.EndOfStream)
            {
                listBox1.Items.Add(sr1.ReadLine());
            }
}
finally { 
  sr1.Close();
}
            FileInfo file2 = new FileInfo("DataNumbers.txt");
            StreamReader sr2 = file2.OpenText();
try {
            while (!sr2.EndOfStream)
            {
                listBox2.Items.Add(sr2.ReadLine());
            }
}
finally {
  sr2.Close();
}

您已打开文件但未关闭。

StreamReader sr1 = file1.OpenText();
StreamReader sr2 = file2.OpenText();

问题发生了,因为您没有关闭流阅读器。

使用外部资源(本例中的文件)的一种更安全的方法是将它们的使用嵌入到using语句中。using语句自动关闭语句块末尾的资源,或者以其他方式关闭语句块。例如,这可能是return语句或异常。可以保证资源将被关闭,即使在发生异常之后。

可以对任何实现IDisposable接口的对象应用using语句。

// Writing to the files
using (var sw1 = new StreamWriter("DataNames.txt")) {
    sw1.WriteLine(textBox1.Text);
}
using(var sw2 = new StreamWriter("DataNumbers.txt")) {
    sw2.WriteLine(textBox2.Text);
}
// Reading from the files
FileInfo file1 = new FileInfo("DataNames.txt");
using (StreamReader sr1 = file1.OpenText()) {
    while (!sr1.EndOfStream) {
        listBox1.Items.Add(sr1.ReadLine());
    }
}
FileInfo file2 = new FileInfo("DataNumbers.txt");
using (StreamReader sr2 = file2.OpenText()) {
    while (!sr2.EndOfStream)
    {
        listBox2.Items.Add(sr2.ReadLine());
    }
}

但是,您可以像这样简化阅读部分

// Reading from the files
listBox1.Items.AddRange(File.ReadAllLines("DataNames.txt"));
listBox2.Items.AddRange(File.ReadAllLines("DataNumbers.txt"));

我以前见过这种行为-通常有另一个打开的进程阻止文件访问。您是否在任务栏中打开了多个开发服务器?(很奇怪,是的,但我见过这种情况)