1

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

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.txt',因为它正被另一个进程使用。”

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

4

6 回答 6

4

尝试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);
    }
于 2013-01-09T20:57:44.187 回答
3

看来您在阅读文件后并未关闭该文件。调用FileInfo.OpenText后,您会得到一个StreamReader必须通过Close方法关闭的,或者更好的是,使用using语句。

但是已经有一些方法可以为您完成所有这些工作,请查看File.WriteAllTextFile.AppendAllTextFile.ReadAllLines方法。

于 2013-01-09T20:54:21.860 回答
1

出现您的问题,因为您没有关闭流阅读器。

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

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

// 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"));
于 2013-01-09T21:00:55.450 回答
1

一旦不再需要 StreamReader 对象,就需要关闭它。这应该可以解决此问题。IE

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();
}
于 2013-01-09T20:53:56.543 回答
1

您已打开文件但未关闭。

StreamReader sr1 = file1.OpenText();
StreamReader sr2 = file2.OpenText();
于 2013-01-09T20:54:04.267 回答
0

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

于 2013-01-09T20:55:00.030 回答