如何关闭已读取的文件

本文关键字:文件 读取 何关闭 | 更新日期: 2023-09-27 17:50:52

所以我试图关闭一个文件(交易.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);
            }

如何关闭已读取的文件

这里的问题是File.ReadLines在您读取文件时保持文件打开,因为您已经在循环中调用了向其写入新文本的,因此文件仍然打开。

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

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

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

现在,务实的头脑可能会争辩说,如果你有很多文本在该文本文件中,File.ReadLines(你目前使用)将使用比File.ReadAllLines(我建议你应该使用)少得多的内存,但如果是这种情况,那么你应该切换到一个数据库,这将更适合你的目的。然而,对于一个在该文件中只有5行代码的玩具项目来说,这有点过分了。

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

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实例将在完成后自动被处理。

你可以试试:

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

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

您可以使用StreamReader类而不是File类的方法。这样你就可以使用Stream.Close()和Stream.Dispose()。