Для очень больших файлов я бы сделал что-то вроде этого
string tempFile = Path.GetTempFileName();
using(var sr = new StreamReader("file.txt"))
using(var sw = new StreamWriter(tempFile))
{
string line;
while((line = sr.ReadLine()) != null)
{
if(line != "removeme")
sw.WriteLine(line);
}
}
File.Delete("file.txt");
File.Move(tempFile, "file.txt");
Обновление Первоначально я написал это еще в 2009 году, и я подумал, что это может быть интересно с обновлением. Сегодня вы можете выполнить вышеизложенное, используя LINQ и отложенное выполнение
var tempFile = Path.GetTempFileName();
var linesToKeep = File.ReadLines(fileName).Where(l => l != "removeme");
File.WriteAllLines(tempFile, linesToKeep);
File.Delete(fileName);
File.Move(tempFile, fileName);
Приведенный выше код почти такой же, как и в первом примере, чтение строки за строкой и сохранение минимального объема данных в памяти.
Отказ от ответственности может быть в порядке, хотя. Поскольку здесь речь идет о текстовых файлах, вам очень редко придется использовать диск в качестве промежуточного носителя. Если вы не имеете дело с очень большими файлами журналов, не должно возникнуть проблем с чтением содержимого в память, и вам не придется иметь дело с временным файлом.
File.WriteAllLines(fileName,
File.ReadLines(fileName).Where(l => l != "removeme").ToList());
Обратите внимание, что .ToList
имеет решающее значение для немедленного выполнения. Также обратите внимание, что во всех примерах предполагается, что текстовые файлы имеют кодировку UTF-8.