Буферизованный StreamWriter для записи в течение длительного периода времени
У меня есть программа, которая будет работать в течение длительного времени (часов), и регулярно записывать вывод в текстовый файл.
Я пытаюсь использовать реализацию TextWriter для записи в файл, и я обеспокоен тем, что сохранение файла открытым в течение всего периода действия может быть проблематичным.
Первый вопрос: будут ли проблемы с производительностью (или другие виды) для сохранения потока открытым для файла в течение продолжительного времени?
Если да, то будет ли StreamWriter (открытый с помощью конструктора имен файлов) управлять открытием и закрытием файла на регулярной основе для меня или он будет держать файл открытым в течение всего времени его существования?
Наконец, есть ли встроенная опция для обработки этих более длительных записей? Или мне понадобится индивидуальная реализация Writer/Stream?
2 ответа
Не рекомендуется открывать файл на неопределенный срок для его записи, потому что это может вызвать проблемы, когда вам нужно создать резервную копию файла, отредактировать файл, прочитать файл или даже если система аварийно завершает работу, когда он находится в процессе запись в файл неизбежно повреждает данные.
Ответ Уилла обеспечивает решение открытия и добавления файла при необходимости. Суть в том, что если файл не записывается в 24/7, то нет причин, по которым вы не должны его закрывать.
Чтобы напрямую ответить на ваш вопрос в смысле файл должен быть открыт 24/7. Я бы использовал асинхронные методы для записи в файл с помощью задач. Таким образом, вы можете вызвать другую задачу для создания резервной копии файла, скажем, каждый день. Резервный файл позволит вам просмотреть информацию о производственном файле.
Лично я бы использовал одну из подпрограмм File.Appendxxx, которая открывает файл, добавляет данные, а затем снова закрывает его.
Если я пишу с такой скоростью, что стоимость всех этих открытий и закрытий слишком высока, то я добавляю какую-то очередь на основе памяти и периодически очищаю ее.
Если вы ведете текстовое ведение журналов, вы можете взглянуть на одну из множества сред ведения журналов для.NET, которая может делать такие вещи за вас, наряду с такими вещами, как вращение имен файлов и т. Д.
StreamWriter / FileStream и т. Д. Обычно будут держать файл открытым, пока вы не утилизируете его.