You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在C#中读取文件末尾的完整内容而非逐字符显示?

在C#中读取文件末尾的完整内容

当然可以!你想要的一次性获取文件末尾指定长度内容的需求,在C#里完全能实现,而且逻辑和你给出的C++代码高度一致。先帮你分析下原来代码的问题:你之前用ReadLine()逐行读取,还加了Console.ReadKey(),导致每次输出一行就暂停,自然没法拿到完整的结果。下面给你两种对应场景的解决方案:

方案1:读取二进制内容(和C++代码逻辑完全匹配)

如果你的file.dll是二进制文件(比如你只是想读取末尾1024字节的原始数据),可以直接用FileStream操作,和C++的QFile用法几乎一致:

using System.IO;
using System;

byte[] GetLast1024Bytes(string filePath)
{
    using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        // 处理文件小于1024字节的情况,避免Seek时出现负数错误
        int bytesToRead = (int)Math.Min(fileStream.Length, 1024);
        // 定位到末尾前bytesToRead的位置
        fileStream.Seek(-bytesToRead, SeekOrigin.End);
        
        byte[] buffer = new byte[bytesToRead];
        // 一次性读取全部指定长度的内容
        fileStream.Read(buffer, 0, bytesToRead);
        
        return buffer;
    }
}

调用这个方法后,返回的byte[]就对应C++代码里的trama,你可以直接使用这个完整的二进制数据,不需要逐字符输出。

方案2:读取文本内容(如果需要解析成字符串)

如果你是把dll当成文本文件来读取(比如里面包含可打印的文本内容),可以用StreamReaderReadToEnd()方法一次性获取从当前位置到文件末尾的所有文本:

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

string GetLast1024CharsAsText(string filePath)
{
    // 如果需要指定编码,比如UTF-8,可以在这里添加参数:new StreamReader(filePath, Encoding.UTF8)
    using (var reader = new StreamReader(filePath))
    {
        var baseStream = reader.BaseStream;
        int bytesToRead = (int)Math.Min(baseStream.Length, 1024);
        baseStream.Seek(-bytesToRead, SeekOrigin.End);
        
        // 一次性读取从当前位置到末尾的全部文本
        return reader.ReadToEnd();
    }
}

这个方法会直接返回完整的末尾文本内容,你可以把它存到变量里,或者一次性输出,再也不需要逐行循环和暂停了。

关键注意点

  • 一定要处理文件大小小于1024字节的情况,否则Seek(-1024)会抛出异常,上面的代码用Math.Min解决了这个问题
  • 如果是文本文件,注意指定正确的编码,避免出现乱码问题

内容的提问来源于stack exchange,提问作者Mohamed El Alami

火山引擎 最新活动