Как эффективно удалить последнюю строку в файле и добавить новый текст для большого файла? - PullRequest
0 голосов
/ 07 октября 2019

Каков эффективный способ замены последней строки в файле?

Я ожидаю, что мой файл оканчивается на "]", и я хотел бы заменить "]" новыми данными, которые снова заканчиваются на"]".

Это всего лишь пример того, что файл будет очень большим ...

Old:
[
a
b
c
]

new:

[
a
b
c
d
e
]

У меня есть полный контроль над тем, как файлынаписаны, созданы.

РЕДАКТИРОВАТЬ:

    // mockData.json
    //[
    //    a
    //    b
    //    c
    //]

    var fileName = "mockData.json";
    var origData = File.ReadAllLines(fileName);
    origData[origData.Length - 1] = " d\n e\n]";
    File.WriteAllLines(fileName, origData);

Ответы [ 3 ]

3 голосов
/ 08 октября 2019

Для этого кода ниже процедура довольно проста, поскольку вы уже знаете, что последний символ в вашем файле - это]. Таким образом, все, что вам нужно сделать, это прочитать последний символ файла, и если это символ], то вы получили этот файл. Если это произойдет, вы усекаете последний байт из файла и добавляете текст в этот файл. Затем добавьте символ], чтобы сохранить формат. Обратите внимание, что это для кодировки ASCII, если ваш последний символ - это нечто большее, чем байт, тогда вам придется немного исправить код.

using System;
using System.IO;
using System.Text;

public class FSSeek
{
    public static void Main()
    {
        string fileName = "test.txt";
        char lastChar = ']';
        string toBeAppend = "d\ne\n";

        using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite))
        {
            fs.Seek(-1, SeekOrigin.End);
            if ( Convert.ToChar(fs.ReadByte()) == lastChar ){
                fs.SetLength(fs.Length - 1);
                fs.Write(Encoding.ASCII.GetBytes(toBeAppend));
                fs.WriteByte(Convert.ToByte(lastChar));
            }            

        }
    }
}

test.txt content:

[
a
b
c
]
0 голосов
/ 07 октября 2019

Вы можете вставить диапазон в список с помощью InsertRange() примерно так, а lines.Count - 1 обеспечит вставку в строку перед последней.

var linesToAdd = new List<string>() { "d", "e" };
var lines = File.ReadAllLines(path).ToList();
lines.InsertRange(lines.Count - 1, linesToAdd);
File.WriteAllLines(path, lines);

Очевидно, что это требует обработки ошибок,для случая, такого как ваш исходный файл, в конце не было ].

0 голосов
/ 07 октября 2019

Мое предложение таково:

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

string fileContent = File.ReadAllText("file.path");
// Remove the last character
fileContent = fileContent.Remove(fileContent.Length - 1);
string newContent = "Your new content";
fileContent += newContent;
// Write content back to the file
File.WriteAllText("file.path", fileContent);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...