解决 用一个窗口选择并阅读最后一行

史蒂夫90

新成员
已加入
2020年5月5日
留言内容
4
编程经验
Beginner
嗨,我需要选择一个带有窗口的文件,并读取所选文件的最后一行。
我尝试过,现在创建了这段代码,可以选择一个文件并全部读取,但是现在我需要读取所选文件的最后一行。谢谢


C#:
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();
            }
        }
    }
}
 
由主持人最后编辑:

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,538
地点
悉尼,澳大利亚
编程经验
10+
请注意,没有 ReadLinesAsync 方法。如果要异步执行,则可以编写自己的方法:
C#:
私有异步任务<string>GetLastLine(字符串filePath)
{
    using (var reader = new StreamReader(filePath))
    {
        string line = null;

        while (!reader.EndOfStream)
        {
            line = await reader.ReadLineAsync();
        }

        return line;
    }
}
 

史蒂夫90

新成员
已加入
2020年5月5日
留言内容
4
编程经验
Beginner
如果只需要最后一行,那么请阅读所有行并丢弃除最后一行以外的所有行:
C#:
var lastLine = File.ReadLines(filePath).Last();
你的意思是这样吗?
C#:
私人void OpenFileBtn_ClickAsync(object sender,EventArgs e)
{
    using(OpenFileDialog ofd = new OpenFileDialog() { Filter = "Text File|*.txt", Multiselect = false })
    {
        if (ofd.ShowDialog() == DialogResult.OK)
        {
            var lastLine = File.ReadLines(ofd.FileName).Last();
        }
    }
}
我试过了,但是没用
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,538
地点
悉尼,澳大利亚
编程经验
10+
首先,我已经在帖子#1中为您格式化了您的代码,并发送了不发布未格式化代码的通知,然后您再次进行了格式化。现在,我再次格式化了您的代码。请不要发布未格式化的代码,因为它太难阅读了。

其次,"it don't work"从来都不是对问题的充分解释。您始终需要解释预期发生的事情以及实际发生的事情。您是否有兴趣阅读该代码并考虑了它的作用?我发布的内容只是一个例子,即用来说明原理的东西。实施该原则取决于您。在原始代码中,您将文件的文本显示在 RuchTextBox。您是否期望最新的代码执行类似的操作,尽管未提及 RichTextBox anywhere?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,558
地点
弗吉尼亚州切萨皮克
编程经验
10+
请注意,没有 ReadLinesAsync 方法。如果要异步执行,则可以编写自己的方法:
但是有一个 ReadAllLinesAsync().  :)

Unfortunately, it returns a 任务 <string[]>, so it'll be a waste of memory to read all the lines into memory and only to take the last line. So the roll-your-own solution proposed in post #3 is still the best approach if you must run async.
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,538
地点
悉尼,澳大利亚
编程经验
10+
But there is a ReadAllLinesAsync().  :)

Unfortunately, it returns a 任务 <string[]>, so it'll be a waste of memory to read all the lines into memory and only to take the last line. So the roll-your-own solution proposed in post #3 is still the best approach if you must run async.
该方法也仅是.NET Core。我们不知道这个问题是与.NET Framework还是.NET Core有关,但我还是倾向于为初学者猜测.NET Framework。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
@史蒂夫90 -有关已显示的示例,请参阅文档。

这是怎么做的:
private async Task<string>GetLastLine(字符串filePath)
看起来像这样:
私人void OpenFileBtn_ClickAsync(object sender,EventArgs e)

不要只是从任何网站上获取代码,并期望它可以立即完成您想做的事情。在使用之前,您应该首先知道代码的作用。了解有关async关键字的信息: 异步-C#参考 和Last(): Enumerable.Last方法(System.Linq) 并阅读 如何:从任务返回值 了解为什么以及如何运作。您可能还想阅读 任务 也。这些文档的存在是有原因的,我建议您通过MSDN搜索,以便您了解要使用的代码。不要成为复制/粘贴程序员。

这就是为什么我更喜欢解释我的代码示例的原因,而不是提供没有解释性内联注释的代码(无论示例多么简单和琐碎)。上面的答复是我为什么这样做的一个主要例子。这不是约翰的事。 -我们的OP确实应该研究您给他们的东西,并首先将其与他们已经拥有的代码进行比较,这也包括您的方法示例中所有纠缠在一起的代码,并尝试通过阅读大量的可用文档来理解它。回到论坛。

我不是想劝阻提问 @史蒂夫90,这就是该板的用途。这个论坛还教人们如何成为更好的程序员。但是并不是每个人都有时间编写他们提供给您的代码的分步示例。大多数示例都不能照原样使用,经常需要您对其进行编辑和自己研究。我们期望您对提供给您的示例进行自己的研究,如果之后仍然有一些您仍然不了解的内容,您可以回来询问我们。

在大多数情况下,您应该花一些时间研究收到的有礼貌的示例,并尝试了解它的工作方式和原因。使用调试器,并根据自己的喜好更改代码。而且只有当您花了一些时间更改并尝试实现该示例时 @jmcilhinney 给你。当您了解需要更改的内容时,请向我们显示更改的内容。
 
最佳 底部