使用c#将组合框值保存在文件中

时间:2013-08-30 12:05:00

标签: c# combobox textbox streamreader

我正在编写一个小程序,它显示我要做的事情,优先级等。在这个程序中我有两个标签:标签1用于创建新的操作,另一个标签用于显示当前要执行的操作。因此,当我在选项卡1中的文本框中输入一些文本并在单击“保存”按钮后,它应将其保存在tab2的组合框中。当我重新启动程序时,它仍应保存。 Google告诉我用文件执行此操作,以便将其保存到文件中。我找到了一个简短的代码,我根据我的程序进行了调整。在这里你可以看到我的代码:

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 个答案:

答案 0 :(得分: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");
            }

        }
    }
}
}

答案 1 :(得分:1)

StreamWriter会阻止您在使用该过程中的文件之前关闭它,或者您必须在字符串中进行更改,并且在进程存在时将更新更新到文件中。

答案 2 :(得分: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。

答案 3 :(得分:1)

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

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

在您的情况下,StreamWriter对象。