Как удалить последнюю строку в текстовом файле? - PullRequest
10 голосов
/ 24 ноября 2010

У меня есть простой текстовый файл журнала с расширением .txt с пробелом в конце этого текстового файла каждый раз, когда файл журнала создается из сторонней программы.

Следовательно, естькакие-либо методы или коды, которые я могу использовать, чтобы удалить последнюю строку текстового файла?

Пример текстового файла журнала:

Sun Jul 22 2001 02:37:46,73882,...b,r/rrwxrwxrwx,0,0,516-128-3,C:/WINDOWS/Help/digiras.chm
Sun Jul 22 2001 02:44:18,10483,...b,r/rrwxrwxrwx,0,0,480-128-3,C:/WINDOWS/Help/cyycoins.chm
Sun Jul 22 2001 02:45:32,10743,...b,r/rrwxrwxrwx,0,0,482-128-3,C:/WINDOWS/Help/cyzcoins.chm
Sun Jul 22 2001 04:26:14,174020,...b,r/rrwxrwxrwx,0,0,798-128-3,C:/WINDOWS/system32/spool/drivers/color/kodak_dc.icm

Ответы [ 4 ]

20 голосов
/ 24 ноября 2010

Как насчет чего-то вроде:

var lines = System.IO.File.ReadAllLines("...");
System.IO.File.WriteAllLines("...", lines.Take(lines.Length - 1).ToArray());

Пояснение:

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

Этот код выполняет чтение всех строк в массив и записывает эти строки обратно в файл, исключая только последнюю строку. (Метод Take () (часть LINQ) принимает указанное количество строк, которое в нашем случае равно length - 1). Здесь var lines можно прочитать как String[] lines.

10 голосов
/ 24 ноября 2010

Используйте этот метод для удаления последней строки файла:

public static void DeleteLastLine(string filepath)
{
    List<string> lines = File.ReadAllLines(filepath).ToList();

    File.WriteAllLines(filepath, lines.GetRange(0, lines.Count - 1).ToArray());

}

Edit: понял, что переменная lines не существовала ранее, поэтому я обновил код.

3 голосов
/ 26 сентября 2016

Вы не можете удалить конец строки, так как File.WriteAllLines автоматически добавляет его, однако вы можете использовать этот метод:

public static void WriteAllLinesBetter(string path, params string[] lines)
{
    if (path == null)
        throw new ArgumentNullException("path");
    if (lines == null)
        throw new ArgumentNullException("lines");

    using (var stream = File.OpenWrite(path))
    using (StreamWriter writer = new StreamWriter(stream))
    {
        if (lines.Length > 0)
        {
            for (int i = 0; i < lines.Length - 1; i++)
            {
                writer.WriteLine(lines[i]);
            }
            writer.Write(lines[lines.Length - 1]);
        }
    }
}

Это не мое, я нашел его в .NET File.WriteAllLines оставляет пустую строку в конце файла

3 голосов
/ 18 сентября 2016

Если вы хотите удалить последние N строк из файла без загрузки всего в память :

int numLastLinesToIgnore = 10;
string line = null;
Queue<string> deferredLines = new Queue<string>();
using (TextReader inputReader = new StreamReader(inputStream))
using (TextWriter outputReader = new StreamWriter(outputStream))
{
    while ((line = inputReader.ReadLine()) != null)
    {
        if (deferredLines.Count() == numLastLinesToIgnore)
        {
            outputReader.WriteLine(deferredLines.Dequeue());
        }

        deferredLines.Enqueue(line);
    }
    // At this point, lines still in Queue get lost and won't be written
}

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

Обратите внимание, что если текст меньше numLastLinesToIgnore, результат будет пустым.

Я придумал это как зеркальное решение этого: Удалить конкретную строку из текстового файла?

...