错误消息'无法写入文本文件:另一个进程正在使用该文件'

Azo*_*l54 1 c# file visual-studio

我的C#表单有一个问题.我有一个文本框,用于在单击按钮到外部txt文件时添加内容,以及用于显示txt文件内容的组合框.

我的代码:

String PathFile = @"Mypath";

private void button1_Click(object sender, EventArgs e)
{
    StreamWriter sw = new StreamWriter(PathFile);
    sw.WriteLine(textBox1.Text);
    sw.Close();
}

private void Form1_Load(object sender, EventArgs e)
{
    try
    {

        StreamReader sr = new StreamReader(PathFile);
        string line = sr.ReadLine();
        while (line != null)
        {
            comboBox1.Items.Add(line);
            line = sr.ReadLine();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error : " + ex.Message);
    }
}
Run Code Online (Sandbox Code Playgroud)

组合框效果很好并显示内容,但是当我尝试使用文本框添加新条目时,结果如下.

system.io.ioexception进程无法访问该文件,因为它正被另一个进程使用

我知道该文件被组合框的进程锁定,但我该怎么办才能解决这种情况?

Moo*_*ice 9

StreamReader在表单加载期间,您不会丢弃它.

using(StreamReader sr = new StreamReader(PathFile))
{
    string line = sr.ReadLine();
    while (line != null)
    {
        comboBox1.Items.Add(line);
        line = sr.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,当您使用将StreamWriter数据写入文件时,还需要处理流:

using(StreamWriter sw = new StreamWriter(PathFile))
{ 
    sw.WriteLine(textBox1.Text);
}
Run Code Online (Sandbox Code Playgroud)

那怎么using办?这是一个非常简洁的结构.IDisposable无论代码是否到达using块的末尾,或者抛出异常,它都需要并确保对象处置.我们需要处理像stream这样的东西,因为它们拥有非托管资源(例如文件句柄),我们不想等待垃圾收集器启动并实际释放句柄.

using 在语义上等同于:

IDisposable someObjectThatIsDispoable; // e.g. StreamWriter/StreamReader, et al
try
{
     // your code here
}
finally
{
    if(someObjectThatIsDisposable != null)
        someObjectThatIsDisposable.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

另外,dispose负责关闭文件,因此调用Close是不必要的(因此它们已从此答案中删除).