/**
* 文件读写类
* 读取时,支持跳过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. 快速搭建ssh(最终版)

    一个月又忘了.还是做个笔记.自己看下就能想起来... 1.在MyEclipse中新建web Project 2.首先整合struts

  2. String与Date、Timestamp互转

    一.String与Date(java.util.Date)互转 1.1 String -> Date String dateStr = "2010/05/04 12:34:23&quo ...

  3. SqlServer Link 链接服务器的使用

    --创建linked exec sp_addlinkedserver 'a','','SQLNCLI','your ipaddress' --登陆linked exec sp_addlinkedsrv ...

  4. Office Web Apps资源

    http://www.cnblogs.com/poissonnotes/p/3277280.html#!comments http://www.cnblogs.com/poissonnotes/p/3 ...

  5. 转:浅谈Radius协议 -来自CSDN:http://blog.csdn.net/wangpengqi/article/details/17097221

    浅谈Radius协议 2013-12-03 16:06 5791人阅读 评论(0) 收藏 举报  分类: Radius协议分析(6)  从事Radius协议开发有段时间了,小弟不怕才疏学浅,卖弄一下, ...

  6. js矩阵菜单或3D立体预览图片效果

    js矩阵菜单或3D立体预览图片效果 下载地址: http://files.cnblogs.com/elves/js%E7%9F%A9%E9%98%B5%E8%8F%9C%E5%8D%95%E6%88% ...

  7. FineUI第四天---PageManage的概述

    页面级别的配置PageManager控件的配置 每一个使用FineUI控件的页面都必须包含一个PageManager控件,我们可以把PageManager控件看做页面级别的参数配置(相对于Web.co ...

  8. iPhone/iOS图片相关(读取、保存、绘制、其它相关)

    http://blog.csdn.net/jerryvon/article/details/7526147 20:50:42 一.读取图片 1.从资源(resource)读取 UIImage* ima ...

  9. UITableView 委托方法总结

    http://blog.sina.com.cn/s/blog_7b9d64af01019x3t.html   总结: UITableViewDelegate row: heightForRow hea ...

  10. 翻译:非常详细易懂的法线贴图(Normal Mapping)

    翻译:非常详细易懂的法线贴图(Normal Mapping) 本文翻译自: Shaders » Lesson 6: Normal Mapping 作者: Matt DesLauriers 译者: Fr ...