C# - Произвольная запись в файл - запись второй строки перед первой строкой

Я пытаюсь записать файл с помощью FileStream и хочу написать вторую строку, а затем написать первую строку. Я использую Seek(), чтобы вернуться к началу после написания второй строки, а затем написать первую строку. Он заменяет вторую строку (или ее часть в зависимости от длины первой строки). Как мне не заставить ее заменить вторую строку?

        var fs = new FileStream("my.txt", FileMode.Create);
        byte[] stringToWrite = Encoding.UTF8.GetBytes("string that should be in the end");
        byte[] stringToWrite2 = Encoding.UTF8.GetBytes("first string\n");
        fs.Write(stringToWrite, 0, stringToWrite.Length);
        fs.Seek(0, SeekOrigin.Begin);
        fs.Write(stringToWrite2, 0, stringToWrite2.Length);

В файл пишется следующее:

first string
hould be in the end

Я хочу, чтобы это было

first string
string that should be in the end

Спасибо


person manojlds    schedule 17.04.2011    source источник
comment
Когда вы ищете начало потока, вы устанавливаете позицию, в которую вы будете писать. Если данные уже есть, они будут перезаписаны.   -  person Russell Troywest    schedule 17.04.2011


Ответы (3)


Сначала вам нужно найти файл, равный длине первой строки.

fs.Seek(stringToWrite2.Length, SeekOrigin.Begin);
fs.Write(stringToWrite, 0, stringToWrite.Length);
fs.Seek(0, SeekOrigin.Begin);

Кроме того, не забудьте удалить свой поток (using).

person Talljoe    schedule 17.04.2011
comment
Но причина, по которой я так пишу, заключается в том, что я не знаю первую строку (и, следовательно, длину), когда пишу вторую строку. - person manojlds; 17.04.2011
comment
В этом случае вам придется перечитать то, что вы уже написали, снова записать это дальше в файл, а затем написать строку, которая идет впереди. - person Talljoe; 17.04.2011
comment
В этом есть смысл. Принятие в качестве ответа. - person manojlds; 17.04.2011

Вы не можете вставить в файл и отправить существующее содержимое обратно. Вы можете только перезаписать или расширить.

Следовательно, вы не можете написать часть файла, пока не узнаете содержимое всего, что ему предшествует.

person David Heffernan    schedule 17.04.2011
comment
Или, по крайней мере, длина предыдущего контента. - person Svish; 20.04.2012

В зависимости от того, чего вы пытаетесь достичь, вам может потребоваться запись в два разных файла, один из которых является временным файлом.

  1. Создайте временный файл со «вторым» содержимым
  2. Создайте новый файл с «первым» содержимым
  3. Откройте первый файл, прочитайте его содержимое и добавьте ко второму файлу.

Если это повторяющееся требование в более крупном решении, может быть, вам нужна какая-то база данных? Может быть, файловая база данных, такая как SqlLite или BerkeleyDb.

Аналогичная проблема обсуждается здесь.

person Jakob Möllås    schedule 17.04.2011