如何关闭已读取的文件

时间:2014-03-19 11:33:24

标签: c# streamreader streamwriter

所以我试图关闭一个已打开的文件(transactions.txt),我已经习惯于读入文本框,现在我想保存回文件,但问题调试说该文件正在使用中所以我需要找到一种方法来关闭它。谁能帮我这个?谢谢!

        SearchID = textBox1.Text;
        string ID = SearchID.ToString();
        bool idFound = false;
        int count = 0;

        foreach (var line in File.ReadLines("transactions.txt"))
        {

            //listView1.Items.Add(line);

            if (line.Contains(ID))
            {
                idFound = true;
            }

            //Displays Transactions if the variable SearchID is found.
            if (idFound && count < 8)
            {
                textBox2.Text += line + "\r\n";
                count++;

            }
        }
    }

    private void SaveEditedTransaction()
    {
        SearchID = textBox1.Text;
        string ID = SearchID.ToString();
        bool idFound = false;
        int count = 0;

        foreach (var lines in File.ReadLines("transactions.txt"))
        {

            //listView1.Items.Add(line);

            if (lines.Contains(ID))
            {
                idFound = true;
            }

            if (idFound)
            {
                string edited = File.ReadAllText("transactions.txt");
                edited = edited.Replace(lines, textBox2.Text);
                File.WriteAllText("Transactions.txt", edited);
            }

4 个答案:

答案 0 :(得分:5)

这里的问题是File.ReadLines在您阅读文件时保持文件处于打开状态,因为您已经调用了新文本 in 循环,文件仍然是开放的。

相反,当你找到id时我会简单地跳出循环,然后把写入文件的if语句放在循环之外。

但是,这意味着您还需要维护要替换的行。

实际上,我会转而使用File.ReadAllLines。这会将整个文件读入内存,并在循环开始之前将其关闭。

现在,实用主义者可能会争辩说,如果该文本文件中包含大量文本,File.ReadLines(您当前正在使用)将使用比File.ReadAllLines少得多的内存(我建议你应该使用),但如果是这样,那么你应该切换到一个数据库,这将更适合你的目的。然而,对于一个在该文件中有5行的玩具项目来说,这有点过分了。

答案 1 :(得分:1)

直接在StreamReader语句中使用using,例如:

var lines = new List<string>();

using (StreamReader reader = new StreamReader(@"C:\test.txt")) {
    var line = reader.ReadLine();

    while (line != null) {
        lines.Add(line);
        line = reader.ReadLine();
    }
}

使用using语句,StreamReader实例在完成后将自动处理。

答案 2 :(得分:0)

您可以使用StreamReader类而不是File类的方法。通过这种方式,您可以使用Stream.Close()和Stream.Dispose()。

答案 3 :(得分:0)

你可以试试这个:

File.WriteAllLines(
    "transactions.txt",
    File.ReadAllLines("transactions.txt")
        .Select(x => x.Contains(ID) ? textBox2.Text : x));

它工作正常,但如果文件很大,你必须找到其他解决方案。