/**
* 文件读写类
* 读取时,支持跳过N个/行字符然后再读取M个/行字符
* 支持每次读取时使用回调函数
*
* 示例:
* $file = new File('a.txt', 'r');
*
* $data = $file->limit(0, 10)->getLine(function($line){
* return $line . ' <br/>';
* });
* print_r($data);
* $file->close();
*
*/ class File { protected $fp = null;
protected $file = null;
protected $limit = [0, 0]; public function __construct($file, $mode = 'r'){ $this->file = $file;
$this->fp = fopen($file, $mode); } public function limit($start, $line = 0){ if(func_num_args() == 1){
$line = $start; $start = 0;
}
$this->limit = [$start, $line];
return $this;
} /**
* 增加对文件函数的直接调用
* @param string $method
* @param mixed $args
* @return mixed
*/
public function __call($method, $args){ array_unshift($args, $this->fp);
return call_user_func_array($method, $args);
} /**
* 读取文件按行
* @param function $func
* @param $read 读取方式
* @param $args 参数列表
* @return mixed
*/
public function readLine($func = null, $read = null, $args = []){ $data = array();
$opt = array('char'=>'fgetc', 'line'=>'fgets', 'csv'=>'fgetcsv');
$read = (isset($opt[$read]))? $opt[$read] : 'fgets';
array_unshift($args, $this->fp); //跳过字符数或行数
if($this->limit[0] !== 0){
for($i = 0; $i < $this->limit[0]; $i++){
if(call_user_func_array($read, $args) === false){
return $data;
}
}
} if($this->limit[1] > 0){
//读取有效行数
for($i = 0; $i < $this->limit[1]; $i++){ if(($buffer = call_user_func_array($read, $args)) === false){
return $data;
}
if(is_callable($func)){
$buffer = $func($buffer);
if($buffer !== null) $data[] = $buffer;
}else{
$data[] = $buffer;
}
} }else{
//读取所有行数
while(($buffer = call_user_func_array($read, $args)) !== false){
if(is_callable($func)){
$buffer = $func($buffer);
if($buffer !== null) $data[] = $buffer;
}
}
}
$this->setHome();
return $data; } /**
* 读取文件按字符
* @param function $func
* @return mixed
*/
public function getChar($func = null){
return implode('', $this->readLine($func, 'char')); } /**
* 读取文件按行
* @param int $length
* @param function $func
* @return mixed
*/
public function getLine($func = null, $length = 1024){ if(is_numeric($func)){
$length = $func; $func = null;
}
return $this->readLine($func, 'line', [$length]);
} /**
* 读按行取csv文件
* @param unknown $func
* @param number $length
* @param string $delimiter
*/
public function getCsv($length = 0, $delimiter = ','){
return $this->readLine($func, 'csv', [$length, $delimiter]);
} /**
* 读取文件按字节
* @param number $length
* @return string
*/
public function read($length = 0){ if(empty($length)) $length = filesize($this->file);
return fread($this->fp, $length);
} /**
* 写入文件
* @param unknown $string
* @param unknown $length
* @return number
*/
public function write($string, $length = null){
return fwrite($this->fp, $string, $length);
} /**
* 写入csv文件
* @param unknown $data
* @param string $delimiter
* @return boolean
*/
public function putCsv($data, $delimiter = ','){ foreach($data as $row) {
fputcsv($fp, $row);
}
} /**
* 获取文件资源指针
* @return resource
*/
public function getfp(){
return $this->fp;
} /**
* 获取当前头文件指针位置
* @return number
*/
public function getSeek(){
return ftell($this->fp);
} /**
* 文件指针定位到开头
* @return boolean
*/
public function setHome(){
return rewind($this->fp);
} /**
* 文件指针定位到结尾
* @return number
*/
public function setEnd(){
return fseek($this->fp, 0, SEEK_END);
} /**
* 设置文件指针位置
* @param unknown $offset
* @param string $whence
* @return number
*/
public function setSeek($offset, $whence = SEEK_SET){
return fseek($this->fp, $offset, $whence);
} /**
* 关闭文件指针
* @return boolean
*/
public function close(){
return fclose($this->fp);
} public static function getSql($file, $isarray = false){ $content = preg_replace(['/[\r|\n]+\s?(((--\s+|#).*)|\/\*(.|\n)*\*\/)/', '/[\r|\n]+/'], '', file_get_contents($file));
if($isarray) $content = array_filter(explode(';', $content));
return $content;
} }

PHP文件处理类的更多相关文章

  1. php 文件日志类

    php文件日志类,按年月日组织目录结构. <?php class FileLog { private $_filepath; //文件路径 private $_filename; //日志文件名 ...

  2. C++文件流类与文件流对象

    文件流是以外存文件为输入输出对象的数据流.输出文件流是从内存流向外存文件的数据,输入文件流是从外存文件流向内存的数据.每一个文件流都有一个内存缓冲区与之对应. 请区分文件流与文件的概念,不用误以为文件 ...

  3. 使用Java的多线程和IO流写一个文件复制功能类

    创建一个复制功能类,继承Thread类,重写run()方法,把FileInputStream和FileOutputStream输入输出流写在run()方法内.示例代码如下: import java.i ...

  4. Code片段 : .properties属性文件操作工具类 & JSON工具类

    摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “贵专” — 泥瓦匠 一.java.util.Properties API & 案例 j ...

  5. 自动扫描FTP文件工具类 ScanFtp.java

    package com.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ja ...

  6. 读取Config文件工具类 PropertiesConfig.java

    package com.util; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io ...

  7. C++学习47 文件的概念 文件流类与文件流对象 文件的打开与关闭

    迄今为止,我们讨论的输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的.在实际应用中,常以磁盘文件作为对象.即从磁盘文件读取数据,将数据输出到磁盘文件.磁盘是计算机的外部存储器 ...

  8. C# - 文件操作类

    除了封装数据流的类 System.IO命名空间中还提供了可以操作文件和目录的类 Directory类 ns:System.IO Level:Object=>Directory 表示目录的类 用于 ...

  9. php加了命名空间没引入初始化文件:类的命名空间要与文件夹名一致namespace Business\Event;缺少了Event

    php加了命名空间没引入初始化文件:类的命名空间要与文件夹名一致namespace Business\Event;缺少了Event

随机推荐

  1. 解决在IE中返回JSON格式的数据时提示下载的问题

    如题,以ASP.NET MVC为例,解决办法如下: 控制器中: public JsonResult Test() { return Json(json, "text/html"); ...

  2. C++中析构函数的作用,

    如果构造函数打开了一个文件,最后不需要使用时文件就要被关闭.析构函数允许类自动完成类似清理工作,不必调用其他成员函数.析构函数也是特殊的类成员函数.简单来说,析构函数与构造函数的作用正好相反,它用来完 ...

  3. [整理]Web应用安全学习

    最近在复习TCP/IP相关知识,同时也想对网络安全相关的知识进行系统的补漏. 阅读了一些常见的关于XSS.CSRF等的一些网上文章: http://www.cnblogs.com/luminji/ca ...

  4. iOS上传应用过程中出现的错误"images contain alpha channels or transparencies"以及解决方案

    如何取消图片透明度  本文永久地址为 http://www.cnblogs.com/ChenYilong/p/3989954.html,转载请注明出处. 当你试图通过<预览>进行" ...

  5. glutBitmapCharacter及glBitmap在ATI显卡下无法正常显示的原因初探

    最近家里台式机的老显卡烧了,所以更换了ATI的HD6450显卡,却发现glutBitmapCharacter及glBitmap都无法正常显示字符,nviDIA和intel的显卡则一切正常. 发邮件咨询 ...

  6. editplus快速定位到文章头部和尾部

    经常用editplus发现有时文档比较长,要查找前面的内容时得一直滚动鼠标滚轮,或者拉动右侧边栏的导航标签,很少麻烦,有没有好的方法快速定位editplus到头部和尾部呢? 其实很简单,editplu ...

  7. Forth scrum meeting - 2015/10/29

    今天下午,我们终于要到了MOOC服务器端开发人员的联系方式,于是我们小组派了三名同学去实验室与他们进行了交流,并咨询了他们一些关于API接口的问题.他们也对我们这个客户端的开发提出了一些建议. 开发团 ...

  8. table表头标题th浮动提示-MyTable.js

    /* $(document).ready(function () { var maxH = ($(window).height() - $("#divParent").positi ...

  9. DCMTK354之VC++ 2008 MFC应用程序配置完整过程

    花了一个礼拜,终于在VC++2008 MFC 应用程序中完成了首个基于DCMTK354的首个程序ECHOSCUWIN32,现将过程记录下来,便于日后查阅,同时也提供给那些有幸看到此博文而对他们又有帮助 ...

  10. 【OpenStack】OpenStack系列13之Nova源码解析与API扩展

    学习思路 议程:代码结构-主干流程-分层架构-业务模型-数据库模型-消息模型 分布式架构:Api:横向扩展    rpc:纵向扩展 分层架构:Controller接口层.View/Manager逻辑层 ...