1、第一种获取文件信息
$file_path = 'd:/file.txt';
// 打开方式
if($fp = fopen($file_path, 'r')){
// 获取文件信息
$file_info = fstat($fp);
// var_dump($file_info);
// 返回文件相关时间
date_default_timezone_set('PRC');
echo '<br>文件创建时间是:' . date('Y-m-d H:i:s', $file_info['ctime']);
echo '<br>文件修改时间是:' . date('Y-m-d H:i:s', $file_info['mtime']);
echo '<br>文件访问时间是:' . date('Y-m-d H:i:s', $file_info['atime']);
} else {
echo '<br>失败';
}
2、第二种获取文件信息
$file_path = 'd:/file.txt';
if(file_exists($file_path)){
echo '<br>文件类型是:' . filetype($file_path);
echo '<br>文件大小是:' . filesize($file_path);
// 返回文件相关时间
date_default_timezone_set('PRC');
// touch($file_path) ; 在php中 touch() 会修改访问时间
echo '<br>文件创建时间是:' . date('Y-m-d H:i:s', filectime($file_path));
echo '<br>文件修改时间是:' . date('Y-m-d H:i:s', filemtime($file_path));
echo '<br>文件访问时间是:' . date('Y-m-d H:i:s', fileatime($file_path));
} else {
echo '<br>文件不存在';
}
3、将文件的内容读取,并显示在网页(3种方式)
3.1 一次性的读取
$file_path = 'd:/file.txt';
// 打开文件
if($fp = fopen($file_path, 'r')){
// 将文件读取到一个字符串
$file_size = filesize($file_path);
// 读取多少字节
$str = fread($fp, $file_size);
// 关闭资源
fclose($fp);
# 对读取内容进行替换
$str = str_replace("\r\n", '<br>', $str);
$str = str_replace("\n", '<br>', $str);
$str = str_replace(" ", ' ', $str); // tab替换,注意空格处是tab空格=4个
echo $str;
} else {
echo '<br>文件不存在';
}
3.2 分字节读取
$file_path = 'd:/file.txt';
// 打开文件
if($fp = fopen($file_path, 'r')){
// 设置字节
$size = 1024;
$temp = '';// 临时接受读取数据
$str = ''; // 最终接收的字符串
// feof() 判断文件是否读到到了结尾
while(!feof($fp)){
$temp = fread($fp, $size);
$str .= $temp;
}
// 关闭资源
fclose($fp);
# 对读取内容进行替换
$str = str_replace("\r\n", '<br>', $str);
$str = str_replace("\n", '<br>', $str);
$str = str_replace(" ", ' ', $str); // tab替换,注意空格处是tab空格=4个
echo $str;
} else {
echo '<br>文件不存在';
}
3.3 最简单,file_get_contents()
$file_path = 'd:/file.txt';
// 将内容读取字符串
$str = file_get_contents($file_path);
# 对读取内容进行替换
$str = str_replace("\r\n", '<br>', $str);
$str = str_replace("\n", '<br>', $str);
$str = str_replace(" ", ' ', $str); // tab替换,注意空格处是tab空格=4个
echo $str;
总结
【推荐】使用第三种方式
【处理海量数据】可以考虑使用第二种使用缓存方法来处理
4、读取外部的ini文件
在项目实施过程中,我们有时候会把一些设置信息,写在外部文件,在运行代码时,从外部文件读取这些信息,比如 用户名密码,主机编码等等
#my.ini文件 格式是规定好的 (属性名=属性值)
user=root
pwd=abc
host=localhost
这时使用parse_ini_file
函数就可以直接处理
$file_path = 'd:/file.txt';
$ini_data = parse_ini_file($file_path);
echo '<br>user = ' . $ini_data['user'];
echo '<br>pwd = ' . $ini_data['pwd'];
echo '<br>host = ' . $ini_data['host'];
这里注意有一个函数可以一行一行读取
fgets()
5、创建文件,并写入内容
创建一个新文件,写入内容 10句
'hello,world'
5.1 fopen()
$file_path = 'd:/file2.txt';
if(!file_exists($file_path)){
$fp = fopen($file_path, 'w'); // 写入方式打开,清除文件内容,如果文件不存在则尝试创建之
// 准备写入的数据
$str = '';
for ($i=0; $i<10; $i++){
$str .= "hello,world\r\n";
}
// 写入文件
fwrite($fp, $str);
fclose($fp);
echo '<br>文件创建,并写入成功';
} else {
echo '<br>文件已经存在';
}
注意
如果追加fopen( $file_path, 'a')
// 用 a\
5.2 file_put_contents()
$file_put_contents($file_path, $str); // 文件不存在,先创建再写入;文件存在,直接写入
$file_put_contents($file_path, $str, FILE_APPEND ); // 追加写入
6、文件删除
使用
unlink()
7、文件修改
修改文件名
rename( $old, $new )
# 注意改成中文名时候,需要先将utf-8 转成gbk或者gb2312
# iconv ( string $in_charset, string $out_charset, string $str )
$new = iconv( 'utf-8', 'gbk', $new ); //转码新文件名
rename($old, $new); // 重命名文件名
8、创建目录
判断是否目录
is_dir()
使用mkdir()
8.1 创建一级目录
# 创建一级目录
$dir_path = 'd:/web';
if(!is_dir($dir_path)){
if(mkdir($dir_path)){
echo '<br>创建目录成功';
} else {
echo '<br>创建目录失败';
}
} else{
echo '<br>该文件已经存在';
}
8.2 创建多级目录
mkdir() 默认只创建一级目录,如果要多级
mkdir($dir_path, 0777, true) 0777表示用户最大权限,window下没意义,linux表示递归创建
# 创建多级目录
$dir_path = 'd:/web/aa/bb/cc';
if(!is_dir($dir_path)){
if(mkdir($dir_path, 0777, true)){
echo '<br>创建目录成功';
} else {
echo '<br>创建目录失败';
}
} else{
echo '<br>该文件已经存在';
}
8.3 删除目录
使用
rmdir()
9、拷贝文件
使用
copy()
# 注意如果有中文名,要用iconv()先转码
copy( $old_paht, $new_path);
10、实例应用
10.1 遍历某个文件夹,判断它们分别是目录还是文件
// 确定对那个文件夹遍历
$dir_path = 'd:/web';
if(is_dir($dir_path)){
# 打开一个目录句柄
$dp = opendir($dir_path);
// 循环读取目录下的文件和目录
while(false !== ($fileName = readdir($dp))){
$fileName = iconv('utf-8', 'gbk', $fileName);
if(is_dir($dir_path . $fileName)){
echo '目录:' . $fileName;
} else {
echo '文件:' . $fileName;
}
}
// 关闭资源
closedir($dp);
} else {
echo '<br>不是目录,无法遍历';
}
10.2 写一个函数统计某个目录所有文件的大小
/**
* 计算目录所有文件大小
* @param $dir_path [string] [目录名]
*/
function getDirSize($dir_path){
// 初始化大小为0
$dirSize = 0;
$dp = opendir($dir_path);
while(false !== ($filename = readdir($dp))){
// 拼接文件路径
$file = $dir_path .'/'. $filename;
// 不是 .表示当前目录, ..表示上级目录
if($filename != '.' && $filename != '..'){
// 判断是子目录还是文件
if(is_dir($file)){
// 目录
$dirSize += getDirSize($file);//递归统计
} else {
// 文件
$dirSize += filesize($file);
}
}
}
closedir($dp);
return $dirSize;
}
10.3 删除某个目录(该目录下有文件和文件夹)
// 限制页面执行时间
set_time_limit(100);
/**
* 删除目录下文件和文件夹
* @param $dir_path [string] [文件目录]
*/
function removeDir($dir_path){
$dp = opendir($dir_path);
while(false !== ($filename = readdir($dp))){
// 拼接文件名
$file = $dir_path .'/'. $filename;
if($filename !='.' && $filename !='..'){
if(is_dir($file)){
// 文件夹
removeDir($file); // 递归删除
} else {
// 文件
unlink($file);
}
}
}
}
10.4 把某个目录的所有文件(包括子目录和其文件)拷贝到其它目录下
// 返回跟操作系统相关的路径分隔符的php内置命令,在windows上返回\,而在linux或者类unix上返回/
define('DS', DIRECTORY_SEPARATOR);
# $old = 'd:/web'; //准备拷贝的路径
# $new = 'e:/www'; //新路径
function copyDir($old, $new){
if(is_dir($old)){
@mkdir( $new, 0777, true); // 创建新路径
$dir_arr = scandir($old); // scandir() 返回指定目录中的文件和目录的数组
// sizeof() 返回数组中元素的数目
if( sizeof($dir_arr) > 0){
foreach ($dir_arr as $file){
# 注意是 .和 .. 不copy
if($file =='.' || $file == '..')
continue;
// go on
if(is_dir($old . DS . $file))
{
copyDir($old . DS . $file, $new . DS . $file); // 递归copy
}
else
{
copy($old . DS . $file, $new . DS . $file); // copy文件
}
}
}
sleep(5);
return true;
} else {
return false;
}
}