如何关闭已读取的文件
本文关键字:文件 读取 何关闭 | 更新日期: 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()。