Добавление текста к началу и концу файла в C#

Это неловко, но, возможно, это поможет гуглеру в будущем.

В верхней части «Консоли диспетчера пакетов» мой проект по умолчанию настроен на неверный проект. Изменение этого в моем проекте модели исправило это.

enter image description here

6
задан adeel825 17 June 2009 в 18:20
поделиться

4 ответа

Если вы не хотите, чтобы это был C #, это было бы легко обработать в командной строке или в пакетном файле.

ECHO ^<root^> > outfile.xml
TYPE temp.xml >> outfile.xml
ECHO ^</root^> >> outfile.xml

Это предполагает, что у вас есть какой-то существующий процесс для получения файлы данных, к которым это может быть подключено.

3
ответ дан 8 December 2019 в 04:31
поделиться

Чтобы не хранить весь файл в памяти, переименуйте исходный файл, затем откройте его с помощью StreamReader . Затем откройте исходное имя файла с помощью StreamWriter , чтобы создать новый файл.

Запишите префикс в файл, затем скопируйте данные большими порциями из устройства чтения в писатель. Когда вы передали все данные, напишите закрывающий (обратите внимание на косую черту, если вы хотите, чтобы это был XML). Затем закройте оба файла и удалите переименованный оригинал.

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);
15
ответ дан 8 December 2019 в 04:31
поделиться

I can't see any real improvement on this...which is kind of a bummer. Since there's no way to "shift" a file you'll always have to move the bytes in the entire file to inject anything at the top.

You may find some performance benefit by using raw streams rather than the StreamReader which has to actually parse the stream as text.

3
ответ дан 8 December 2019 в 04:31
поделиться

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);
}

Если вам нужно значительно увеличить использование памяти, используйте второй файл, как предложил Эрвикер.

Править :
Добавлен код для обработки спецификации (метка порядка байтов).

4
ответ дан 8 December 2019 в 04:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: