C # - случайная запись в файл - запись второй строки перед первой строкой - PullRequest
4 голосов
/ 17 апреля 2011

Я пытаюсь записать в файл, используя 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

Спасибо

Ответы [ 3 ]

4 голосов
/ 17 апреля 2011

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

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

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

3 голосов
/ 17 апреля 2011

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

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

2 голосов
/ 17 апреля 2011

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

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

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

Подобная проблема обсуждается здесь .

...