1

我正在编写一个小程序,它显示我的待办事项、优先级等。在这个程序中,我有 2 个选项卡:选项卡 1 用于创建新的待办事项,另一个选项卡用于显示当前的待办事项。因此,当我在选项卡 1 的文本框中输入一些文本并单击“保存”按钮后,它应该将其保存在选项卡 2 的组合框中。当我重新启动程序时,它仍然应该被保存。谷歌告诉我用一个文件来做这件事,这样我就可以把它保存到一个文件中。我找到了一个短代码,我针对我的程序进行了调整。在这里你可以看到我的代码:

private void Form1_Load(object sender, EventArgs e)
{
    // Check if directory exists
    if (Directory.Exists(@"C:\Users\rs\Desktop\Test\)"))
    {
        // Do nothing
    }

    else
    {
        Directory.CreateDirectory(@"C:\Users\rs\Desktop\Test\");
    }

    if (File.Exists(@"C:\Users\rs\Desktop\Test\test.txt"))
    {
        // Do nothing
    }

    else
    {
        File.Create(@"C:\Users\rs\Desktop\Test\test.txt");
    }

    StreamReader sr = new StreamReader(@"C:\Users\rs\Desktop\Test\test.txt");
    while (sr.Peek() >= 0)
    {
        combox_Name2.Items.Add(sr.ReadLine());
    }
    sr.Close();
}

private void btn_Save_Click(object sender, EventArgs e)
{

    StreamWriter writer = new StreamWriter(@"C:\Users\rs\Desktop\Test\test.txt", true);

    try
    {
        Process.Start(combox_Name2.Text, txt_Name.Text);

        if (combox_Name2.Items.Contains(txt_Name.Text))
        {
            // Do nothing
        }

        else
        {
            writer.WriteLine(combox_Name2.Text);
            writer.Flush();
            writer.Dispose();
            combox_Name2.Items.Add(txt_Name.Text);
        }
    }

    catch
    {
        MessageBox.Show("The file '" + txt_Name.Text + "' could not be located", "File could not be located");
    }
}

而我现在的问题是:每次我启动程序,在文本框中输入一些文本并点击保存按钮,就会出现在线错误

StreamReader sr = new StreamReader(@"C:\Users\rs\Desktop\Test\test.txt");

VS2012说进程无法继续,C:\Users\rs\Desktop\Test\test.txt因为它已经在另一个进程中启动了。

有人可以给我一个提示吗?

干杯

4

4 回答 4

2

以下代码将实现您的目标。如果有效,请标记为答案。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;

namespace FileHandling
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // Check if directory exists
        if (Directory.Exists(@"C:\Users\rs\Desktop\Test\)"))
        {
            // Do nothing
        }

        else
        {
            Directory.CreateDirectory(@"C:\Users\rs\Desktop\Test\");
        }

        if (File.Exists(@"C:\Users\rs\Desktop\Test\test.txt"))
        {
            // Do nothing
        }

        else
        {
            File.Create(@"C:\Users\rs\Desktop\Test\test.txt");
        }

        using (StreamReader writer = new StreamReader(@"C:\Users\rs\Desktop\Test\test.txt"))
        {
            while (writer.Peek() >= 0)
            {
                combox_Name2.Items.Add(writer.ReadLine());
            }
            writer.Close();
        }

    }

    private void btn_Save_Click(object sender, EventArgs e)
    {
        using (StreamWriter writer = new StreamWriter(@"C:\Users\rs\Desktop\Test\test.txt", true))
        {
            try
            {
                if (combox_Name2.Items.Contains(txt_Name.Text))
                {
                    MessageBox.Show("The task '" + txt_Name.Text + "' already exist in list", "Task already exists");
                }

                else
                {
                    combox_Name2.Items.Add(txt_Name.Text);
                    writer.WriteLine(txt_Name.Text);
                    writer.Flush();
                    writer.Dispose();
                }
            }

            catch
            {
                MessageBox.Show("The file '" + txt_Name.Text + "' could not be located", "File could not be located");
            }

        }
    }
}
}
于 2013-08-30T12:36:48.213 回答
1

StreamWriter 阻止您这样做,您必须在进程中使用文件之前关闭它,或者您必须在字符串中进行更改,而不是在进程存在时更新文件中的更改。

于 2013-08-30T12:12:27.733 回答
1

您忘记关闭/处置作者。这对读者来说也很重要。你应该习惯这样写:

using(StreamWriter writer = new StreamWriter(@"C:\Users\rs\Desktop\Test\test.txt", true))
{
    // do your thing here.

}

即使内部抛出异常,这也会始终关闭流。

这将像这样编译:

StreamWriter writer = new StreamWriter(@"C:\Users\rs\Desktop\Test\test.txt", true);
try
{
    // do your thing here.

}
finally
{
    writer.Dispose();
}

实际问题出在这里:File.Create(@"C:\Users\rs\Desktop\Test\test.txt");

文件已创建,但您没有引用结果。声明public static FileStream Create( string path )这会将结果(FileStream)发送到垃圾中,并在垃圾收集器收集它时进行处理。你不知道什么时候发生。该文件将保持打开状态,直到它被垃圾收集。您可以删除整行。如果文件不存在,请不要执行 StreamReader 部分。

combox_Name2.Items.Clear();
if (File.Exists(@"C:\Users\rs\Desktop\Test\test.txt"))
{
    using(StreamReader sr = new StreamReader(@"C:\Users\rs\Desktop\Test\test.txt"))
    {
        while (sr.Peek() >= 0)
        {
            combox_Name2.Items.Add(sr.ReadLine());
        }
    }
}

不要忘记删除!在 File.Exists 处。

于 2013-08-30T12:12:40.890 回答
1

始终将实现 IDisposable 接口的对象放在

using(IDisposable object goes here)
{
    // Do something.
}

在您的情况下是 StreamWriter 对象。

于 2013-08-30T12:23:48.447 回答