Adding text to beginning and end of file in C#
c#, file-io, xml
Solution
To avoid holding the whole file in memory, rename the original file, then open it with `StreamReader`. Then open the original filename with `StreamWriter` to create a new file.
Write the `<root>` prefix to the file, then copy data in large-ish chunks from the reader to the writer. When you've transferred all the data, write the closing `</root>` (note the forward slash if you want it to be XML). Then close both files and delete the renamed original.
char[] buffer = new char[10000];
string renamedFile = file.FullName + ".orig";
File.Move(file.FullName, renamedFile);
using (StreamReader sr = new StreamReader(renamedFile))
using (StreamWriter sw = new StreamWriter(file.FullName, false))
{
sw.Write("<root>");
int read;
while ((read = sr.Read(buffer, 0, buffer.Length)) > 0)
sw.Write(buffer, 0, read);
sw.Write("</root>");
}
File.Delete(renamedFile);
Problem
I have a process which picks up a series of "xml" files. The reason I put xml in quotes is that that the text in the file does not have a root element which makes in invalid xml. In my processing, I want to correct this and open up each file add a root node to the beginning and end of each file, and then close it up. Here is what I had in mind, but this involves opening the file, reading the entire file, tagging on the nodes, and then writing the entire file out. These files may be more than 20 MB in size. ``` foreach (FileInfo file in files) { //open the file StreamReader sr = new StreamReader(file.FullName); // add the opening and closing tags string text = "<root>" + sr.ReadToEnd() + "<root>"; sr.Close(); // now open the same file for writing StreamWriter sw = new StreamWriter(file.FullName, false); sw.Write(text); sw.Close(); } ``` Any recommendations?