PHP进阶(五)——文件操作
2016-07-26 21:04
603 查看
文件读取
file_get_contents(),可以将整个文件全部读取到一个字符串中。
$content = file_get_contents('./test.txt');
file_get_contents也可以通过参数控制读取内容的开始点以及长度。
file_get_contents(path,include_path,context,start,max_length)
path 必需。规定要读取的文件。
include_path 可选。如果也想在 include_path 中搜寻文件的话,可以将该参数设为 "1"。
context 可选。规定文件句柄的环境。 context 是一套可以修改流的行为的选项。若使用 null,则忽略。
start 可选。规定在文件中开始读取的位置。该参数是 PHP 5.1 新加的。
max_length 可选。规定读取的字节数。该参数是 PHP 5.1 新加的。
$content = file_get_contents('./test.txt', null, null, 100, 500);
判断文件是否存在
一般情况下在对文件进行操作的时候需要先判断文件是否存在,PHP中常用来判断文件存在的函数有两个is_file与file_exists.
$filename = './test.txt';
if (file_exists($filename)) {
echo file_get_contents($filename);
}
如果只是判断文件存在,使用file_exists就可以,file_exists不仅可以判断文件是否存在,同时也可以判断目录是否存在,从函数名可以看出,is_file是确切的判断给定的路径是否是一个文件。
$filename = './test.txt';
if (is_file($filename)) {
echo file_get_contents($filename);
}
更加精确的可以使用is_readable与is_writeable在文件是否存在的基础上,判断文件是否可读与可写。
$filename = './test.txt';
if (is_writeable($filename)) {
file_put_contents($filename, 'test');
}
if (is_readable($filename)) {
echo file_get_contents($filename);
}
取得文件的修改时间
文件有很多元属性,包括:文件的所有者、创建时间、修改时间、最后的访问时间等。
fileowner:获得文件的所有者
filectime:获取文件的创建时间
filemtime:获取文件的修改时间
fileatime:获取文件的访问时间
其中最常用的是文件的修改时间,通过文件的修改时间,可以判断文件的时效性,经常用在静态文件或者缓存数据的更新。
$mtime = filemtime($filename);
echo '修改时间:'.date('Y-m-d H:i:s', filemtime($filename));
取得文件的大小
通过filesize函数可以取得文件的大小,文件大小是以字节数表示的。
$filename = '/data/webroot/usercode/resource/test.txt';
$size = filesize($filename);
遍历目录文件
注意:以下代码转载自 http://www.nowamagic.net/php/php_TraversalAllFilesInDir.php
读取大文件
注意:以下内容转自http://www.tuicool.com/articles/yQn2q2F
一个文件如果知道有几行的话,就可以控制获取一定的行数的数据,然后放入数据库。这样不管的读取大文件的性能,还是写入数据库的性能,都能得到很大的提高了。
下面是获取文件的行数的方法
string stream_get_line ( resource $handle , int $length [, string $ending ] )
从给定的资源流里读取一行。 当读取到 length 个字节数就结束,或者当在读取的字符串中发现 ending (不包含到返回值里)也结束,又或者遇到了 EOF 也结束(总之以上条件中哪个先出现就以哪个为准)。 这个函数与 fgets() 几乎是相同的,唯一的区别是在这个函数里面允许指定行尾的定界符,而不是使用标准的 \n, \r 还有 \r\n ,并且返回值中不包含定界符。
(注:也可以把 \n 等作为定界符传入 ending )。
以下的程序主要是每次最大入库1000条,余数不足1000的就入余数。 入库10W条数据时间也才几秒,所以说性能非常好。
1
file_get_contents(),可以将整个文件全部读取到一个字符串中。
$content = file_get_contents('./test.txt');
file_get_contents也可以通过参数控制读取内容的开始点以及长度。
file_get_contents(path,include_path,context,start,max_length)
path 必需。规定要读取的文件。
include_path 可选。如果也想在 include_path 中搜寻文件的话,可以将该参数设为 "1"。
context 可选。规定文件句柄的环境。 context 是一套可以修改流的行为的选项。若使用 null,则忽略。
start 可选。规定在文件中开始读取的位置。该参数是 PHP 5.1 新加的。
max_length 可选。规定读取的字节数。该参数是 PHP 5.1 新加的。
$content = file_get_contents('./test.txt', null, null, 100, 500);
判断文件是否存在
一般情况下在对文件进行操作的时候需要先判断文件是否存在,PHP中常用来判断文件存在的函数有两个is_file与file_exists.
$filename = './test.txt';
if (file_exists($filename)) {
echo file_get_contents($filename);
}
如果只是判断文件存在,使用file_exists就可以,file_exists不仅可以判断文件是否存在,同时也可以判断目录是否存在,从函数名可以看出,is_file是确切的判断给定的路径是否是一个文件。
$filename = './test.txt';
if (is_file($filename)) {
echo file_get_contents($filename);
}
更加精确的可以使用is_readable与is_writeable在文件是否存在的基础上,判断文件是否可读与可写。
$filename = './test.txt';
if (is_writeable($filename)) {
file_put_contents($filename, 'test');
}
if (is_readable($filename)) {
echo file_get_contents($filename);
}
取得文件的修改时间
文件有很多元属性,包括:文件的所有者、创建时间、修改时间、最后的访问时间等。
fileowner:获得文件的所有者
filectime:获取文件的创建时间
filemtime:获取文件的修改时间
fileatime:获取文件的访问时间
其中最常用的是文件的修改时间,通过文件的修改时间,可以判断文件的时效性,经常用在静态文件或者缓存数据的更新。
$mtime = filemtime($filename);
echo '修改时间:'.date('Y-m-d H:i:s', filemtime($filename));
取得文件的大小
通过filesize函数可以取得文件的大小,文件大小是以字节数表示的。
$filename = '/data/webroot/usercode/resource/test.txt';
$size = filesize($filename);
遍历目录文件
注意:以下代码转载自 http://www.nowamagic.net/php/php_TraversalAllFilesInDir.php
<?php function listDir($dir) { if(is_dir($dir)) { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { if((is_dir($dir."/".$file)) && $file!="." && $file!="..") { echo "<b><font color='red'>文件名:</font></b>",$file,"<br><hr>"; listDir($dir."/".$file."/"); } else { if($file!="." && $file!="..") { echo $file."<br>"; } } } closedir($dh); } } } //开始运行 listDir("./nowamagic"); ?>
读取大文件
注意:以下内容转自http://www.tuicool.com/articles/yQn2q2F
一个文件如果知道有几行的话,就可以控制获取一定的行数的数据,然后放入数据库。这样不管的读取大文件的性能,还是写入数据库的性能,都能得到很大的提高了。
/* 返回文件从X行到Y行的内容(支持php5、php4) */ public function getFileLines($filename, $startLine = 1, $endLine=50, $method='rb') { $content = array(); $count = $endLine - $startLine; if(version_compare(PHP_VERSION, '5.1.0', '>=')){/* 判断php版本(因为要用到SplFileObject,PHP>=5.1.0) */ $fp = new SplFileObject($filename, $method); $fp->seek($startLine-1);/* 转到第N行, seek方法参数从0开始计数 */ for($i = 0; $i <= $count; ++$i) { $content[] = unserialize($fp->current());/* current()获取当前行内容 */ $fp->next();/* 下一行 */ } }else{ /*PHP<5.1 */ $fp = fopen($filename, $method); if(!$fp) return 'error:can not read file'; for ($i=1;$i<$startLine;++$i) { /* 跳过前$startLine行 */ fgets($fp); } for($i;$i<=$endLine;++$i){ $content[] = unserialize(fgets($fp));/* 读取文件行内容 */ } fclose($fp); } return array_filter($content); /* array_filter过滤:false,null,'' */ }
下面是获取文件的行数的方法
$temp_file = 'error.log'; $fp = fopen($temp_file ,'r') or die("open file failure!"); $total_line = 0; if($fp){ /* 获取文件的一行内容,注意:需要php5才支持该函数; */ while(stream_get_line($fp, 8192, "\r\n")){ $total_line++; } fclose($fp); }
string stream_get_line ( resource $handle , int $length [, string $ending ] )
从给定的资源流里读取一行。 当读取到 length 个字节数就结束,或者当在读取的字符串中发现 ending (不包含到返回值里)也结束,又或者遇到了 EOF 也结束(总之以上条件中哪个先出现就以哪个为准)。 这个函数与 fgets() 几乎是相同的,唯一的区别是在这个函数里面允许指定行尾的定界符,而不是使用标准的 \n, \r 还有 \r\n ,并且返回值中不包含定界符。
(注:也可以把 \n 等作为定界符传入 ending )。
以下的程序主要是每次最大入库1000条,余数不足1000的就入余数。 入库10W条数据时间也才几秒,所以说性能非常好。
define('EACH_NUM', 1000); /* 每次入库的条数 */ if(!$total_line) die('no record!'); $logs = mod('logs_error'); $temp = array(); $num = ceil($total_line/EACH_NUM); $mod = fmod($total_line,EACH_NUM); for($i=0;$i<$num;$i++){ if(($i+1) == $num && $mod){ $temp = $logs->getFileLines($temp_file, $i*EACH_NUM+1, $mod); $insert_num += $mod; }else{ $temp = $logs->getFileLines($temp_file, $i*EACH_NUM+1, ($i+1)*EACH_NUM); $insert_num += EACH_NUM; } /* 入库 */ $logs->insert($temp); } @unlink($temp_file); echo "Insert Record:{$insert_num} \nSuccess"; exit();
1
相关文章推荐
- 一个关于if else容易迷惑的问题
- PHP5.2.*防止Hash冲突拒绝服务攻击的Patch
- 深入理解PHP之匿名函数
- JSP/PHP基于Ajax的分页功能实现
- 关于PHP通过PDO用中文条件查询MySQL的问题。
- 什么是设计模式
- PHP数据库长连接mysql_pconnect的细节
- Php Installing An Expansion
- rem : web app适配的秘密武器
- jquery高级应用之Deferred对象
- 关于浮动与清除浮动,你应该知道的
- 数组reduce方法的高级技巧
- php7 读取php.ini[4]
- PHP+Apache在Windows 9x下的安装和配置
- IIS 6 的 PHP 最佳配置方法
- 安装Apache和PHP的一些补充
- Linux Apache+MySQL+PHP
- 建立Apache+PHP+MySQL数据库驱动的动态网站