[PHP] 使用ftell和fseek函数直接定位文件位置获取部分数据
对于大文件只获取部分数据很有用
1.使用ftell函数可以获取当前指针的字节位置
2.使用fseek函数可以直接定位到指定的位置
3.读取指定字节的数据就可以部分获取文件内容了
<?php
class FileStream
{
private $fp = null;
private $mode = 'r';
private $context = null;
private $readonly = false;
private $writeonly = false;
private $appendMode = false; public function __construct($file, $mode = 'r', $context = null)
{
$mode = trim($mode);
if (isset($mode[0])) {
$this->mode = strtolower($mode);
} if ($context) {
$this->context = $context;
$this->fp = fopen($file, $mode, false, $this->context);
} else {
$this->fp = fopen($file, $mode);
} if (!$this->fp) {
throw new Exception('can not open ' . $file);
} if ($this->mode == 'r') {
$this->readonly = true;
} elseif ($this->mode == 'w') {
$this->writeonly = true;
} elseif ($this->mode[0] == 'a') {
$this->appendMode = true;
}
} public function __destruct()
{
$this->close();
} public function close()
{
if (!$this->fp) {
fclose($this->fp);
$this->fp = null;
}
} public function read($size)
{
if ($this->writeonly) {
throw new Exception('write only');
} if (!$this->fp) {
throw new Exception('stream already closed');
} $buf = fread($this->fp, $size);
if ($buf === false) {
throw new Exception('read failed');
} return $buf;
} public function readLine()
{
if ($this->writeonly) {
throw new Exception('write only');
} if (!$this->fp) {
throw new Exception('stream already closed');
} return fgets($this->fp);
} public function readAll()
{
if ($this->writeonly) {
throw new Exception('write only');
} if (!$this->fp) {
throw new Exception('stream already closed');
} $buf = ''; while (true) {
$s = fread($this->fp, 8192);
if ($s === false) {
throw new Exception('read failed');
} if (!isset($s[0])) {
break;
} $buf .= $s;
} return $buf;
} public function write($data)
{
if ($this->readonly) {
throw new Exception('read only');
} if (!$this->fp) {
throw new Exception('stream already closed');
} if (fwrite($this->fp, $data) === false) {
throw new Exception('write failed');
}
} public function tell()
{
if ($this->appendMode) {
throw new Exception('tell can not work on appendmode');
} if (!$this->fp) {
throw new Exception('stream already closed');
} $p = ftell($this->fp);
if ($p === false) {
throw new Exception('tell failed');
} return $p;
} public function seek($position)
{
if ($this->appendMode) {
throw new Exception('seek can not work on seekmode');
} if (!$this->fp) {
throw new Exception('stream already closed');
} if (fseek($this->fp, $position) !== 0) {
throw new Exception('seek failed');
}
}
} $stream=new FileStream("1.log");
$start=0;
$end=0;
//获取开始和结束的字节位置
while($ln=$stream->readLine()){
if($ln=="3333333333333\r\n"){
$start=$stream->tell();
}
if($ln=="5555555555555\r\n"){
$end=$stream->tell();
}
}
var_dump($start,$end); //直接定位到开始的字节位置
$stream->seek($start);
//读取指定字节数的数据
$res=$stream->read($end - $start); var_dump($res);
1.log的内容
2.获取部分结果
[PHP] 使用ftell和fseek函数直接定位文件位置获取部分数据的更多相关文章
- php使用file函数、fseek函数读取大文件效率分析
php读取大文件可以使用file函数和fseek函数,但是二者之间效率可能存在差异,本文章向大家介绍php file函数与fseek函数实现大文件读取效率对比分析,需要的朋友可以参考一下. 1. 直接 ...
- Eclipse 进入代码定位文件位置
- shell 字符串中定位字符位置 获取字符位置
linux shell 字符串操作(长度,查找,替换)详解 该博文中描述的如下两个字符串操作, ${string:position} #在$string中, 从位置$position开始提取子串 ${ ...
- 文件操作:fseek函数和ftell函数
1.fseek函数: int fseek(FILE * _File, long _Offset, int _Origin); 函数设置文件指针stream的位置.如果执行成功,stream将指向以fr ...
- 如何通过ftell和fseek来获取文件大小
#include <stdio.h> int main () { FILE * pFile=NULL; long size; pFile = fopen ("myfile.txt ...
- PHP fseek() 函数
定义和用法 fseek() 函数在打开的文件中定位. 该函数把文件指针从当前位置向前或向后移动到新的位置,新位置从文件头开始以字节数度量. 如果成功该函数返回 0,如果失败则返回 -1.请注意,移动到 ...
- C中的fseek函数使用
函数名:fseek函数 头文件:#include<stdio.h> 功能:把与fp有关的文件位置指针放到一个指定位置. 格式: int fseek(FILE *stream, long ...
- PHP移动文件指针ftell()、fseek()、rewind()总结
在对文件进行读写过程中,有时需要在文件中跳转.同不同位置读取,以及将数据写入到不同的位置.例如,使用文件模拟数据库保存数据,就需要移动文件指针.指针的位置是以从文件头开始的字节数度量的,默认以不同模式 ...
- strtok()函数、fseek()函数、fwrite()函数、fread()函数的使用
在电子词典这个项目过程中遇到了几个主要的问题,第一个是怎么解决把翻译分开这个.第二个事情就是怎么把结构体写到文件中.这两个问题,一个是关于字符串的操作一个是关于文件的操作. strtok函数 char ...
随机推荐
- 解决vue+springboot前后端分离项目,前端跨域访问sessionID不一致导致的session为null问题
问题: 前端跨域访问后端接口, 在浏览器的安全策略下默认是不携带cookie的, 所以每次请求都开启了一次新的会话. 在后台打印sessionID我们会发现, 每次请求的sessionID都是不同的, ...
- (入门SpringBoot)SpringBoot项目事务(三)
Spring声明式事务的使用:由@Transactional进行标注,可以使用在类和方法上.当标注在类上,类下面所有公共非静态的方法都将启用事务功能.接下来,运行事务注解标注的方法,Spring的事务 ...
- pugixml的简单使用
一.简介 pugixml的官方主页为:http://pugixml.org/ pugixml是一个很棒的XML操作库, 它很轻量,只有三个文件(pugiconfig.hpp pugixml.cpp ...
- C++ class 内的 [] 重载示例。
#include <iostream> // overloading "operator [] " inside class ///////////////////// ...
- 《LSM算法原理》
记内存中的树为T0, 硬盘上的树按时间顺序,记做T1, ..., Tk 读: T0 Tk -> Tk-1 -> ... -> T0 写 T0 T0超过一定大小后,插入硬盘变为Tk+1 ...
- CentOS7 安装 anaconda
Anaconda是一个开源的Python发行版本,可以帮助我们更方便地配置Python环境. 如果只需要某些包,或者需要节省带宽或存储空间,也可以使用Miniconda这个较小的发行版 0. 开始前 ...
- 9.Go-反射、日志和线程休眠
9.1反射 在Go语言标准库中reflect包提供了运行时反射,程序运行过程中动态操作结构体 当变量存储结构体属性名称,想要对结构体这个属性赋值或查看时,就可以使用反射 反射还可以用作判断变量类型 整 ...
- 【2019.8.7 慈溪模拟赛 T2】环上随机点(ran)(自然算法)
简单声明 我是蒟蒻不会推式子... 所以我用的是乱搞做法... 大自然的选择 这里我用的乱搞做法被闪指导赐名为"自然算法",对于这种输入信息很少的概率题一般都很适用. 比如此题,对 ...
- 在Ubuntu18.04.2LTS上安装搜狗输入法
在Ubuntu18.04.2LTS上安装搜狗输入法 一.前言 最近项目使用到了Linux系统,因此就安装了Ubuntu18.04.2这个最新的LTS的OS.整体的使用效果是不敢恭维的,特别是使用虚拟机 ...
- DirectShow 学习方法
DirectShow(简称 DShow) 是一个 Windows 平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能. 这篇博客主要是简单讲下如何学习 Direct Show 框架,避免让自己少 ...