C# txt文本读取最后X行

using System.IO;

/// <summary>
/// 读取文本文件最后的内容
/// </summary>
/// <param name="AFileName">文件名</param>
/// <param name="ALineCount">行数</param>
/// <param name="AEncoding">字符编码</param>
/// <returns>返回读取的内容</returns>
public string ReadLastLine(string AFileName, int ALineCount, Encoding AEncoding)
{
    if (ALineCount <= 0) return string.Empty;
    if (!File.Exists(AFileName)) return string.Empty; // 文件不存在
    if (AEncoding == null) AEncoding = Encoding.Default;
    using (FileStream vFileStream = new FileStream(AFileName,
        FileMode.Open, FileAccess.Read, FileShare.Read))
    {

        if (vFileStream.Length <= 0) return string.Empty; // 空文件
        byte[] vBuffer = new byte[0x1000]; // 缓冲区
        int vReadLength; // 读取到的大小
        int vLineCount = 0; // 读取的行数
        int vReadCount = 0; // 读取的次数
        int vScanCount = 0; // 扫描过的字符数
        long vOffset = 0; // 向后读取的位置
        do
        {
            vOffset = vBuffer.Length * ++vReadCount;
            int vSpace = 0; // 偏移超出的空间
            if (vOffset >= vFileStream.Length) // 超出范围
            {
                vSpace = (int)(vOffset - vFileStream.Length);
                vOffset = vFileStream.Length;
            }
            vFileStream.Seek(-vOffset, SeekOrigin.End); //“SeekOrigin.End”反方向偏移读取位置

            vReadLength = vFileStream.Read(vBuffer, 0, vBuffer.Length - vSpace);
            #region 所读的缓冲里有多少行
            for (int i = vReadLength - 1; i >= 0; i--)
            {
                if (vBuffer[i] == 10)
                {
                    if (vScanCount > 0) vLineCount++; // #13#10为回车换行
                    if (vLineCount >= ALineCount) break;
                }
                vScanCount++;
            }
            #endregion 所读的缓冲里有多少行
        } while (vReadLength >= vBuffer.Length && vOffset < vFileStream.Length && 
            vLineCount < ALineCount);

        if (vReadCount > 1) // 读的次数超过一次,则需重分配缓冲区
        {
            vBuffer = new byte[vScanCount];
            vFileStream.Seek(-vScanCount, SeekOrigin.End);
            vReadLength = vFileStream.Read(vBuffer, 0, vBuffer.Length);
        }
        return AEncoding.GetString(vBuffer, vReadLength - vScanCount, vScanCount);
    }
}

private void button1_Click(object sender, EventArgs e)
{
    textBox1.Text = ReadLastLine(@"c:\temp\WindowsUpdate.log", 7, Encoding.Default);
}
以上代码转载于http://bbs.csdn.net/topics/230002962,31楼

猜你喜欢

转载自blog.csdn.net/fenglifeng1987/article/details/47165187