20 МБ это не очень много, но когда вы читаете его как строку, он использует около 40 МБ памяти. Это тоже не очень много, но это обработка, которую вам не нужно делать. Вы можете обрабатывать его как необработанные байты, чтобы уменьшить использование памяти и избежать декодирования и перекодирования данных:
byte[] start = Encoding.UTF8.GetBytes("<root>");
byte[] ending = Encoding.UTF8.GetBytes("</root>");
byte[] data = File.ReadAllBytes(file.FullName);
int bom = (data[0] == 0xEF) ? 3 : 0;
using (FileStream s = File.Create(file.FullName)) {
if (bom > 0) {
s.Write(data, 0, bom);
}
s.Write(start, 0, start.Length);
s.Write(data, bom, data.Length - bom);
s.Write(ending, 0, ending.Length);
}
Если вам нужно значительно сократить использование памяти, используйте второй файл, как предложил Earwicker.
Edit:
Добавлен код для обработки спецификации (метка порядка байтов).