获取文件内容行数

<?php
declare(strict_types=1);
ini_set('display_errors', 'On');
error_reporting(-1);

/**
 * 获取文件内容行数
 * 规定①:文件为空时(判断是否为空的依据是文件大小),文件内容行数为0。
 * 规定②:文件末尾行是空行时不算做一行,即末尾空行不计入文件内容行数。
 *
 * @param string $filename 文件路径
 * @return int 文件内容行数
 */
function fileline(string $filename): int
{
    $filesize = filesize($filename); // 获取文件大小,单位:字节
    if ($filesize === false || $filesize === 0) {
        $line = 0; // 文件为空(也有可能获取文件大小失败,但都归为文件为空的情况)
    } else {
        $line = 1; // 文件不为空
    }

    // 文件不为空才进一步获取行数
    if ($line === 1) {
        $handle = fopen($filename, 'rb'); // 打开文件

        $counter = 1; // 行数计数器(打开文件时指针是在第1行,所以计数器初始值为设为1)

        while (true) {
            fgets($handle, 4096); // 文件指针移到下一行

            // 检查是否到达文件结尾(EOF)
            if (feof($handle)) {
                fseek($handle, -1, SEEK_END); // 将文件指针移回文件尾之前1个字节的位置
                $end = fgets($handle, 4096); // 获取末尾行的内容
                break;
            }

            $counter++; // 行数计数器自增1
        }

        fclose($handle); // 关闭文件

        // 若末尾行内容为PHP_EOL说明是空行,根据末尾空行不算做一行的规定,行数计数器需要自减1
        $end === PHP_EOL && $counter--;

        $line = $counter;
    }

    return $line;
}

$filename = __DIR__ . '/test.txt';
$fileline = fileline($filename);
echo "文件内容行数:$fileline" . PHP_EOL;

Copyright © 2024 码农人生. All Rights Reserved