所以我试图关闭一个已打开的文件(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);
}
答案 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));
它工作正常,但如果文件很大,你必须找到其他解决方案。