Member 14786879 Ответов: 4

Как прочитать последнюю строку текстового файла, выбранного с помощью этого кода? Или с другим режимом?


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

Что я уже пробовал:

private async void OpenFileBtn_ClickAsync(object sender, EventArgs e)
{
 using(OpenFileDialog ofd = new OpenFileDialog() { Filter = "Text File|*.txt", Multiselect = false })
  {
   if (ofd.ShowDialog() == DialogResult.OK)
    {
     using (StreamReader rd = new StreamReader(ofd.FileName))
     {
      ReaderRichTxtBox.Text = await rd.ReadToEndAsync();
     }
    }
  }
}

4 Ответов

Рейтинг:
20

phil.o

Ты можешь попробовать

using (StreamReader rd = new StreamReader(ofd.FileName))
{
   string[] lines = rd.ReadToEnd().Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
   ReaderRichTxtBox.Text = lines[lines.Length - 1];
}


Member 14786879

Он говорит, что есть 2 ошибки:
- Environment.NewLine -> Это невозможно преобразовать из 'string' в 'char'
- StringSplitOptions.RemoveEmptyEntries -> Это невозможно преобразовать в 'char'

phil.o

И все же ... , Split(String, StringSplitOptions) определяемый. правка: в .NET Core 3.1 ...
Я изменил решение с помощью синтаксиса, совместимого с .NET Framework.

phil.o

Я думаю, что Мацей Лос заслуживает этого знака лучше, чем я; его решение кажется немного более элегантным, чем мое. Если бы вы могли это исправить, это было бы здорово.

Maciej Los

5ed!

phil.o

И тебе спасибо :)

Рейтинг:
2

ZurdoDev

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

Пример того, как читать через строки, находится здесь, Как читать текстовый файл по одной строке за раз - руководство по программированию на C# | Microsoft Docs[^] , плюс миллионы других примеров в интернете.


Member 14786879

Мне не нужно читать строку за строкой, мне просто нужно выбрать файл и прочитать последнюю строку.
Я уже искал в Интернете решение, но не нашел его.
Вы знаете, как реализовать мой код?

ZurdoDev

Как я уже сказал, один из способов-читать строчку за строчкой. Другой способ-читать в массив, а затем захватить последний элемент, но вы все равно читаете весь файл. См. Решение 2.

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

Рейтинг:
0

Maciej Los

Прежде всего, пожалуйста, прочтите это: Прочтите последние 150 строк из большого текстового файла с помощью C#[^]

Цитата:
Легко видеть, что невозможно прочитать последние N строк, не прочитав все предыдущие строки.


Итак, вы должны прочитать "строки" до конца, чтобы иметь возможность получить последнюю.

Другой способ-читать "строки" через File.ReadAllLines() метод:

string[] lines = File.ReadAllLines("fullfilename.txt");
int cnt = lines.Length-1;
string lastline = lines[cnt];


Примечание: там нет асинхронной версии.

Для асинхронного доступа к файлам, пожалуйста, прочтите это: Использование асинхронного доступа к файлам (C#) | Microsoft Docs[^]

[РЕДАКТИРОВАТЬ]
Дополнительная информация из комментария.

Ричард Диминг писал::

Вместо того чтобы читать весь файл в массив, я бы предпочел использовать ReadLines и LastOrDefault. :)

string lastLine = File.ReadLines("fullfilename.txt").LastOrDefault();


Метод File.ReadLines (System.IO) | Microsoft Docs[^]


phil.o

5 б.

Maciej Los

Спасибо.

Richard Deeming

Вместо того чтобы читать весь файл в массив, я был бы склонен использовать ReadLines и LastOrDefault. :)

string lastLine = File.ReadLines("fullfilename.txt").LastOrDefault();

Метод File.ReadLines (System.IO) | Microsoft Docs[^]

Maciej Los

Очень интересно! Я был недостаточно любопытен ;)
Спасибо тебе, Ричард!
Смотрите обновленный ответ ;)

Рейтинг:
0

Patrice T

Цитата:
Привет, мне нужно выбрать файл с окном и прочитать последнюю строку выбранного файла.

Если файл мал, то просто чтение файла-это нормальное решение, если файл огромен, то объем памяти тоже будет огромен, и это может быть проблемой.

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

файловый поток.Метод Seek(Int64, SeekOrigin) (System.IO) | Microsoft Docs[^]
Пример кода:
using System;
using System.IO;

public class FSSeek
{
    public static void Main()
    {
        long offset;
        int nextByte;

        // alphabet.txt contains "abcdefghijklmnopqrstuvwxyz"
        using (FileStream fs = new FileStream(@"c:\temp\alphabet.txt", FileMode.Open, FileAccess.Read))
        {
            for (offset = 1; offset <= fs.Length; offset++)
            {
                fs.Seek(-offset, SeekOrigin.End);
                Console.Write(Convert.ToChar(fs.ReadByte()));
            }
            Console.WriteLine();

            fs.Seek(20, SeekOrigin.Begin);

            while ((nextByte = fs.ReadByte()) > 0)
            {
                Console.Write(Convert.ToChar(nextByte));
            }
            Console.WriteLine();
        }
    }
}
// This code example displays the following output:
//
// zyxwvutsrqponmlkjihgfedcba
// uvwxyz