/**
* 文件读写类
* 读取时,支持跳过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. 6种编写HTML和CSS的最有效的方法

    感谢HTML5和CSS3,以及JavaScript,前端开发者有了大大的用武之地.大家都在用很多的工具和技术来武装自己,以加快前段的开发. 本文分享了6中最有效的方法,希望能提供你的效率,为你节约时间 ...

  2. dns (域名系统)

    dns (域名系统) DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP ...

  3. 关于angularjs 中自定义过滤器

    包子认为,在angularjs中,经常需要用到自定义过滤器,来过滤相应的功能,自定义过滤器非常的简单,我就直接贴代码啦 其中input就是你需要进行操作的对象,,,用法就直接就是 是不是很easy.. ...

  4. detours安装和使用

    http://blog.csdn.net/evi10r/article/details/6659354 http://blog.csdn.net/donglinshengan/article/deta ...

  5. 用WP_Query自定义WordPress 主循环

    我们知道操作 WordPress 主循环(WordPress Loop)最容易的方法是使用 query_posts 函数. 但是使用 query_posts 直接修改 WordPress 默认的主循环 ...

  6. XSS跨站脚本攻击实例讲解,新浪微博XSS漏洞过程分析

    2011年6月28日晚,新浪微博遭遇到XSS蠕虫攻击侵袭,在不到一个小时的时间,超过3万微博用户受到该XSS蠕虫的攻击.此事件给严重依赖社交网络的网友们敲响了警钟.在此之前,国内多家著名的SNS网站和 ...

  7. 破解LR时,解决loadrunner 破解错误:license security violation.Operation is not allowed

    一.由于在压力测试执行中,出现一个-10803的错误 ,为解决这个错误,重新设置的环境变量,在次执行错误,这个问题解决了,但另外一个问题出来了,LR,打开脚本编辑器老提示找不到TEMP目录,当时没有想 ...

  8. [BZOJ1067][SCOI2007]降雨量

    [BZOJ1067][SCOI2007]降雨量 试题描述 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意 Y<Z<X,Z年的降雨量严格 ...

  9. spring+hibernate常见异常集合

    spring+hibernate出错小结: (1)java.lang.NoClassDefFoundError: org/hibernate/context/CurrentSessionContext ...

  10. CC MayClg 15 T3

    www.codechef.com/MAY15/problems/CHAPD 一道比较神奇的题目... 看到题目后自己yy出了个傻逼算法...然后对拍都是对的...提交都是错的...然后一看" ...