[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 ...
随机推荐
- kettle教程---增量更新
以下操作都在5.0.1版本下进行开发,其余版本可以进行自动比对 在平时工作当中,会遇到这种情况,而且很常见.比如:增量抽取(每隔2个小时抽取截至到上次抽取时间的记录) 一.操作前提: 存在3张表,源表 ...
- python批量执行脚本,使用unittest.TestSuit(); unittest.TextTestRunner().run(); addTest();unittest.defaultTestLoader.discover();
#alltest.py中内容如下import unittest,osdef all(): #path="D:\\study\\python_api_test\\test1203" ...
- 题解:swj社会摇进阶第二课
题目链接 思路:按题目推一点点可以得出答案为 sigma (i-k)*n/i+d(n%i>=k) #include<bits/stdc++.h> using namespace st ...
- 《Dapper》
最近看了google的分布式追踪系统dapper的论文:http://static.googleusercontent.com/external_content/untrusted_dlcp/rese ...
- NOIP模拟赛three(3)
题目描述 Description 很久很久以前,有两个长度为 \(n\) 的排列 \(a\) 和 \(b\) 以及一个长度为 \(n\) 的由 \(1\) 和\(2\) 组成的序列 c.对于 \(1& ...
- 探索ASP.Net Core 3.0系列六:ASP.NET Core 3.0新特性启动信息中的结构化日志
前言:在本文中,我将聊聊在ASP.NET Core 3.0中细小的变化——启动时记录消息的方式进行小的更改. 现在,ASP.NET Core不再将消息直接记录到控制台,而是正确使用了logging 基 ...
- client-go客户端自定义开发Kubernetes及源码分析
介绍 client-go 是一种能够与 Kubernetes 集群通信的客户端,通过它可以对 Kubernetes 集群中各资源类型进行 CRUD 操作,它有三大 client 类,分别为:Clien ...
- pixijs shader颗粒化显示贴图
pixijs shader颗粒化显示贴图 const app = new PIXI.Application({ transparent: true }); document.body.appendCh ...
- 生成 RSA 公钥和私钥的方法
在使用 RSA 加密算法时,需要使用到一对 公钥 和 私钥,生成 公钥 和 私钥 需要借助 openssl 这款工具,下载这款工具的地址如下: http://slproweb.com/products ...
- AutoDesk公司搞的fbx模型格式
FBX® data exchange technology is a 3D asset exchange format that facilitates higher-fidelity data ex ...