C# удаление, перезапись строки в текстовом файле
Имею следующий код:
string path = @"C:\ContractRN\RN_Contract.txt";
using (StreamReader sr = new StreamReader(path, System.Text.Encoding.Default))
{
string line;
while ((line = sr.ReadLine()) != null)
{
try
{
ProcessContract(line);
}
catch (NoSuchElementException e)
{
Logger.Error($"Ошибка: {e.Message}");
RecordingInFile.FailedReplaceForExeption(line, "Не смог обработать");
RecordingInFile.RNContractForAllProcessing(line);
Page.Open("http://pik-test19.informicus.ru/client/#!/contractExecution/contracts/FL44");
return;
}
}
}
что он делает, достает строку и файла и начинает ее обработку,
дело в том, что строк будет около 5 к, я бы хотел бы, чтобы после каждой итерации цикла while он удалял уже обработанную строку данных, потому что, если он упадет, то все будет обрабатывать заново, помогите, пожалуйста, желательно с примерами, заранее спасибо.
Ответы (1 шт):
5000 строк - это совсем мало. Если процесс обработки затягивается, то скорее всего у вас плохой код в методе обработки, и его нужно оптимизировать. Нет никакого смысла наворачивать костыли на этот процесс в виде полной перезаписи файла после обработки каждой строки, как минимум потому что это в десятки раз еще замедлит процесс. Запустил - обработал - почистил файл - всё. Здесь достаточно убрать return.
Важно: Encoding.Default - не надо так делать. На разных компах разная кодировка по умолчанию может быть. И обязательно случится так, что вы не сможете прочитать файл, записанный на другом компе. Испольльзуйте StreamReader без явного указания кодировки, тогда он будет читать в кодироке UTF-8 без BOM по умолчанию.
string path = @"C:\ContractRN\RN_Contract.txt";
using (StreamReader sr = File.OpenRead(path))
{
while (!sr.EndOfStream)
{
string line = sr.ReadLine();
try
{
ProcessContract(line);
}
catch (NoSuchElementException e)
{
Logger.Error($"Ошибка: {e.Message}");
RecordingInFile.FailedReplaceForExeption(line, "Не смог обработать");
RecordingInFile.RNContractForAllProcessing(line);
Page.Open("http://pik-test19.informicus.ru/client/#!/contractExecution/contracts/FL44");
}
}
}
File.Move(path, path + ".backup"); // создание резервной копии, если требуется
File.WriteAllText(path, ""); // полная очистка файла
Либо, если вы хотите перезаписать файл, только за исключением "плохих" строк, то можно так
string path = @"C:\ContractRN\RN_Contract.txt";
string tmpPath = @"C:\ContractRN\RN_Contract.txt.tmp";
using (StreamReader sr = File.OpenRead(path))
using (StreamWriter sw = File.Create(tmpPath))
{
while (!sr.EndOfStream)
{
string line = sr.ReadLine();
try
{
ProcessContract(line);
sw.WriteLine(line);
}
catch (NoSuchElementException e)
{
Logger.Error($"Ошибка: {e.Message}");
RecordingInFile.FailedReplaceForExeption(line, "Не смог обработать");
RecordingInFile.RNContractForAllProcessing(line);
Page.Open("http://pik-test19.informicus.ru/client/#!/contractExecution/contracts/FL44");
}
}
}
File.Delete(path);
File.Move(tmpPath, path);
Только не забудьте реализовать качественную обработку ошибок, чтобы не терять данные, если что-то пойдет не так. Например файл не откроется или возникнет ошибка при доступе к диску во время выполнения метода.