php文件操作(最后进行文件常用函数封装)
文件信息相关api
$filename="./1-file.php"; //filetype($filename):获取文件的类型,返回的是文件的类型 echo '文件类型为:',filetype($filename),"\n";//file //filesize($filename):获得文件的大小,返回字节 echo '文件大小为:',filesize($filename),"\n";//1214 //filectime($filename):获取文件的创建时间 echo '文件创建时间为:',filectime($filename),"\n";//1578719729 echo '文件创建时间为:',date('y年m月d日 h:i:s',filectime($filename)),"\n";//2020年01月11日 13:15:29 //filemtime($filename):文件的修改时间 echo '文件的修改时间为:',date("y/m/d h:i:s",filemtime($filename)),"\n";//2020/01/11 14:28:20 //fileatime($filename):文件的最后访问时间 echo '文件的最后访问时间为:',date("y/m/d h:i:s",fileatime($filename)),"\n";//2020/01/11 14:28:20
检测文件是否可读、可写、可执行is_readable()、is_writeable()、is_executable();
$filename="./1-file.php"; var_dump( is_readable($filename),//bool(true) is_writable($filename),//bool(true) is_writeable($filename),//bool(true) is_executable($filename)//bool(false) );
is_file($filename):检测是否为文件,并且文件存在
var_dump(is_file($filename));//bool(true)
pathinfo():文件路径相关信息
$filename="./test1.txt"; $pathinfo=pathinfo($filename); print_r($pathinfo); /* array ( [dirname] => . [basename] => test1.txt [extension] => txt [filename] => test1 ) */ echo '文件扩展名:',pathinfo($filename,pathinfo_extension),"\n";//txt $filename=__file__; echo pathinfo($filename,pathinfo_dirname),"\n";//d:\phpstudy_pro\www\phptest echo pathinfo($filename,pathinfo_basename),"\n";//2-path.php echo pathinfo($filename,pathinfo_extension),"\n";//php echo pathinfo($filename,pathinfo_filename),"\n";//2-path //basename():返回路径中的文件名部分 echo basename($filename),"\n";//2-path.php echo basename($filename,'.php'),"\n";//2-path //dirname():返回文件名中路径部分 echo dirname($filename),"\n";//d:\phpstudy_pro\www\phptest //file_exists():检测文件或者目录是否存在 var_dump(file_exists($filename));//d:\phpstudy_pro\www\phptest\2-path.php:31:bool(true) touch('aa.txt');
文件相关操作
文件创建、删除、剪切、重命名、拷贝
//touch($filename):创建文件 $filename='test1.txt'; var_dump(touch($filename));//bool(true) //unlink($filename):删除指定文件 var_dump(unlink($filename));//bool(true) //检测文件存在则删除 if(file_exists($filename)){ if(unlink($filename)){ echo '文件删除成功'; }else{ echo '文件删除失败'; } }else{ echo '要删除的文件不存在';//要删除的文件不存在 } touch($filename); //rename($filename,$newname):重命名或者剪切文件 $newname='test111.txt'; if(rename($filename,$newname)){ echo '重命名成功';//重命名成功 }else{ echo '重命名失败'; } //将test123.txt剪切到test目录下test123.txt $filename='test123.txt'; $path='./test/test123.txt'; if(file_exists($filename)){ if(rename($filename,$path)){ echo '文件剪切成功'; }else{ echo '文件剪切失败';//文件剪切失败 } }else{ echo '文件不存在'; } //copy($source,$dest):复制文件 $source='2-path.php'; $dest='test123/2-path.php'; if(copy($source,$dest)){ echo '文件拷贝成功'; }else{ echo '文件拷贝失败';//文件拷贝失败 } //拷贝远程文件需要开启php配置文件中的allow_url_fopen=on var_dump(copy('http://blog.phpfamily.org/wp-content/uploads/2016/09/king-1.jpg','./king-1.jpg'));//bool(false)
文件内容相关操作
//fopen():打开指定文件,以指定的方式来打开 $handle=fopen($filename,'r'); var_dump($handle);//resource(5) of type (stream) //fread():读取文件内容 一个中文3个字节 $res=fread($handle,3); echo $res,"\n";//这 $res=fread($handle,3); echo $res,"\n";//是(接着上一次继续读取) //filesize() 函数返回指定文件的大小 echo filesize($filename),"\n";//55 $res=fread($handle,filesize($filename)); echo $res,"\n";//(接着上一次继续读取)读取全部内容 //一段测试文本 //这是另一段测试文本hh //ftell返回文件指针读/写的位置 echo ftell($handle),"\n";//55 var_dump(fread($handle,21));//string(0) "" //fseek($handle,$num):重置指针 fseek($handle,0); var_dump(fread($handle,21));//string(21) "这是一段测试文" //fclose($handle):关闭文件句柄 fclose($handle); var_dump(fread($handle,21));//bool(false)
文件写入
$filename=__dir__.'/aa.txt'; //rb+ 读写打开一个二进制文件,允许读写数据,文件必须存在 $handle=fopen($filename,'rb+'); //fwrite()/fputs():写入内容 //注意:fwrite向文件写入内容,如果之前有内容,会产生覆盖 fwrite($handle,'abcdef',3); fclose($handle); //abc是一段测试文本 //这是另一段测试文本hh
文件追加
//如果文件不存在会创建, //如果文件存在,会先将文件内容截断为0,接着在开始写入 $filename="./aa.txt"; //ab+ 追加模式 $handle=fopen($filename,'ab+'); fwrite($handle,php_eol.'hello king'); fclose($handle); //abc是一段测试文本 //这是另一段测试文本hh //hello king
截断文件
$filename='aa.txt'; $handle=fopen($filename,'rb+'); //ftruncate():截断文件 ftruncate($handle,4); fclose($handle); //abcæ 第四个中文被截断后的奇葩效果哈哈哈哈
检测文件指针是否到了文件末尾
$filename='aa.txt'; $handle=fopen($filename,'rb+'); //feof():检测文件指针是否到了文件末尾 while(!feof($handle)){ //一个字符一个字符读取 // echo fgetc($handle); //一行一行读取 echo fgets($handle)."\n"; //一行一行读取,并且过滤html标记 echo strip_tags(fgets($handle))."\n"; //fgetss() 函数从打开的文件中读取一行并过滤掉 html 和 php 标记 echo fgetss($handle); }
fgetcsv() 函数从文件指针中读入一行并解析 csv 字段
$filename='user.csv'; $handle=fopen($filename,'rb+'); $rows=[]; while($row=fgetcsv($handle)){ $rows[]=$row; } print_r($rows); $handle=fopen('user1.csv','rb+'); while($row=fgetcsv($handle,0,'-')){ print_r($row); }
fputcsv() 函数将行格式化为 csv 并写入一个打开的文件
$filename='user3.csv'; $handle=fopen($filename,'wb+'); $data=[ ['id'=>1,'coursename'=>'ios','coursedesc'=>'this is ios'], ['id'=>2,'coursename'=>'android','coursedesc'=>'this is android'], ['id'=>3,'coursename'=>'swift','coursedesc'=>'this is swift'] ]; foreach($data as $val){ fputcsv($handle,$val,'-'); } fclose($handle);
获取到文件中的文本
$filename="./aa.txt"; $string=file_get_contents($filename); echo $string; //abc是一段测试文本 //这是另一段测试文本hh //hello king
向文件中写入内容
不存在则创建再写入
$filename='./aa.txt'; //file_put_contents($filename,$data):向文件中写入内容 //$data是字符串格式 file_put_contents($filename,'this is a test'); $res=file_get_contents($filename); print_r($res);//this is a test echo "\n"; //如果不想覆盖之前的内容,可以先把文件中读取出来,接着再来写入 $string=file_get_contents($filename); $data=$string.'this is a test'; file_put_contents($filename,$data); $res=file_get_contents($filename); print_r($res);//this is a testthis is a test //如果文件不存在,file_put_contents()会创建这个文件 $filename='aaa.txt'; $data=[ ['a','b','c'], ['d','e','f'] ]; file_put_contents($filename,$data); //数组或者对象序列化之后写入文件 $data=['a','b','c']; $data=serialize($data); file_put_contents($filename,$data); $res=file_get_contents($filename); print_r(unserialize($res)); //( //[0] => a //[1] => b //[2] => c //) // 将数组或者对象转换成json之后写入文件 $data=[ ['a','b','c'], ['d','e','f'] ]; $data=json_encode($data); file_put_contents($filename,$data); $res=json_decode(file_get_contents($filename)); print_r($res); // //array //( // [0] => array // ( // [0] => a // [1] => b //[2] => c // ) // // [1] => array //( // [0] => d // [1] => e //[2] => f // ) // //)
常用函数封装:
【文件常用操作函数封装】
/** * 创建文件操作 * @method create_file * @param string $filename 文件名 * @return boolean true|false */ function create_file(string $filename){ //检测文件是否存在,不存在则创建 if(file_exists($filename)){ return false; } //检测目录是否存在,不存在则创建 if(!file_exists(dirname($filename))){ //创建目录,可以创建多级 mkdir(dirname($filename),0777,true); } if(file_put_contents($filename,'')!==false){ return true; } return false; } var_dump(create_file('2.txt'));//bool(true) var_dump(create_file('a/4.txt'));//bool(true) /** * 删除文件操作 * @method del_file * @param string $filename 文件名 * @return boolean true|false */ function del_file(string $filename){ //检测删除的文件是否存在,并且是否有权限操作 if(!file_exists($filename)||!is_writable($filename)){ return false; } if(unlink($filename)){ return true; } return false; } var_dump(del_file('a/3.txt'));//bool(false) /** * 拷贝文件操作 * @method copy_file * @param string $filename 文件名 * @param string $dest 指定目录 * @return boolean true|false */ function copy_file(string $filename,string $dest){ //检测$dest是否是目标并且这个目录是否存在,不存在则创建 if(!is_dir($dest)){ mkdir($dest,0777,true); } $destname=$dest.directory_separator.basename($filename); //检测目标路径下是否存在同名文件 if(file_exists($destname)){ return false; } //拷贝文件 if(copy($filename,$destname)){ return true; } return false; } var_dump(copy_file('2.txt','a'));//bool(true) /** * 重命名操作 * @method rename_file * @param string $oldname 原文件 * @param string $newname 新文件名 * @return boolean true|false */ function rename_file(string $oldname,string $newname){ //检测原文件并且存在 if(!is_file($oldname)){ return false; } //得到原文件所在的路径 $path=dirname($oldname); $destname=$path.directory_separator.$newname; if(is_file($destname)){ return false; } if(rename($oldname,$newname)){ return true; } return false; } // var_dump(rename_file('2.txt','333.txt')); /** * 剪切文件操作 * @method cut_file * @param string $filename 原文件 * @param string $dest 目标路径 * @return boolean true|false */ function cut_file(string $filename,string $dest){ if(!is_file($filename)){ return false; } if(!is_dir($dest)){ mkdir($dest,0777,true); } $destname=$dest.directory_separator.basename($filename); if(is_file($destname)){ return false; } if(rename($filename,$destname)){ return true; } return false; } var_dump(cut_file('333.txt','a')); var_dump(cut_file('22.txt','a'));
【文件信息相关函数封装】
/** * 返回文件信息 * @method get_file_info * @param string $filename 文件名 * @return mixed 文件信息相关数组|false */ function get_file_info(string $filename){ if(!is_file($filename)||!is_readable($filename)){ return false; } return [ 'atime'=>date("y-m-d h:i:s",fileatime($filename)), 'mtime'=>date("y-m-d h:i:s",filemtime($filename)), 'ctime'=>date("y-m-d h:i:s",filectime($filename)), 'size'=>trans_byte(filesize($filename)), 'type'=>filetype($filename) ]; } var_dump(get_file_info('22.txt')); /** * 字节单位转换的函数 * @method trans_byte * @param int $byte 字节 * @param integer $precision 默认精度,保留小数点后2位 * @return string 转换之后的字符串 */ function trans_byte(int $byte,int $precision=2){ $kb=1024; $mb=1024*$kb; $gb=1024*$mb; $tb=1024*$gb; if($byte<$kb){ return $byte.'b'; }elseif($byte<$mb){ return round($byte/$kb,$precision).'kb'; }elseif($byte<$gb){ return round($byte/$mb,$precision).'mb'; }elseif($byte<$tb){ return round($byte/$gb,$precision).'gb'; }else{ return round($byte/$tb,$precision).'tb'; } } var_dump(trans_byte(12345678));//string(7) "11.77mb"
【文件读写函数封装】
/** * 读取文件内容,返回字符串 * @method read_file * @param string $filename 文件名 * @return mixed 文件内容|false */ function read_file(string $filename){ //检测是否是一个文件并且文件已存在 if(is_file($filename) && is_readable($filename)){ return file_get_contents($filename); } return false; } var_dump(read_file('232.txt'));//bool(false) /** * 读取文件中的内容到数组中 * @method read_file_array * @param string $filename 文件名 * @param boolean $skip_empty_lines 是否过滤空行 * @return mixed array|false */ function read_file_array(string $filename,bool $skip_empty_lines=false){ if(is_file($filename)&&is_readable($filename)){ if($skip_empty_lines){ return file($filename,file_ignore_new_lines|file_skip_empty_lines); }else{ return file($filename); } } return false; } var_dump(read_file_array('22.txt',true)); /** * 向文件中写入内容 * @method write_file * @param string $filename 文件名 * @param mixed $data 数据,数组和对象需要处理 * @return boolean true|false */ function write_file(string $filename,$data){ $dirname=dirname($filename); //检测目标路径是否存在 if(!file_exists($dirname)){ mkdir($dirname,0777,true); } //判断内容是否是数组或者对象 if(is_array($data)||is_object($data)){ //序列化数据 $data=serialize($data); } //向文件中写入内容 if(file_put_contents($filename,$data)!==false){ return true; }else{ return false; } } var_dump(write_file('c/1.txt',['a','b','c'])); /** * 向文件中写入内容,之前内容不清空 * @method write_file1 * @param string $filename 文件名 * @param mixed $data 数据 * @param boolean $clearflag 是否清空文件 * @return boolean true|false */ function write_file1(string $filename,$data,bool $clearflag=false){ $dirname=dirname($filename); //检测目标路径是否存在 if(!file_exists($dirname)){ mkdir($dirname,0777,true); } //检测文件是否存在并且可读 if(is_file($filename)&&is_readable($filename)){ //读取文件内容,之后和新写入的内容拼装到一起 if(filesize($filename)>0){ $srcdata=file_get_contents($filename); } } //判断内容是否是数组或者对象 if(is_array($data)||is_object($data)){ //序列化数据 $data=serialize($data); } //拼装到一起 $data=$srcdata.$data; //向文件中写入内容 if(file_put_contents($filename,$data)!==false){ return true; }else{ return false; } } var_dump(write_file1('22.txt','hello world')); /** * 截断文件到指定大小 * @method truncate_file * @param string $filename 文件名 * @param int $length 长度 * @return boolean true|false */ function truncate_file(string $filename,int $length){ //检测是否是文件 if(is_file($filename)&&is_writable($filename)){ $handle=fopen($filename,'r+'); $length=$length<0?0:$length; ftruncate($handle,$length); fclose($handle); return true; } return false; } var_dump(truncate_file('22.txt',2));
【文件下载函数封装】
/** * 下载文件 * @method down_file * @param string $filename 文件名 * @param array $allowdownext 允许下载的文件类型 * @return void */ function down_file(string $filename,array $allowdownext=array('jpeg','jpg','png','gif','txt','html','php','rar','zip')){ //检测下载文件是否存在,并且可读 if(!is_file($filename)||!is_readable($filename)){ return false; } //检测文件类型是否允许下载 $ext=strtolower(pathinfo($filename,pathinfo_extension)); if(!in_array($ext,$allowdownext)){ return false; } //通过header()发送头信息 //告诉浏览器输出的是字节流 header('content-type:application/octet-stream'); //告诉浏览器返回的文件大小是按照字节进行计算的 header('accept-ranges: bytes'); //告诉浏览器返回的文件大小 header('accept-length: '.filesize($filename)); //告诉浏览器文件作为附件处理,告诉浏览器最终下载完的文件名称 header('content-disposition: attachment;filename=king_'.basename($filename)); //读取文件中的内容 readfile($filename); exit; } 规定每次读取文件的字节数为1024字节,直接输出数据 /** * 下载文件 * @method down_file * @param string $filename 文件名 * @param array $allowdownext 允许下载的文件类型 * @return void */ function down_file1(string $filename,array $allowdownext=array('jpeg','jpg','png','gif','txt','html','php','rar','zip')){ //检测下载文件是否存在,并且可读 if(!is_file($filename)||!is_readable($filename)){ return false; } //检测文件类型是否允许下载 $ext=strtolower(pathinfo($filename,pathinfo_extension)); if(!in_array($ext,$allowdownext)){ return false; } //通过header()发送头信息 //告诉浏览器输出的是字节流 header('content-type:application/octet-stream'); //告诉浏览器返回的文件大小是按照字节进行计算的 header('accept-ranges: bytes'); $filesize=filesize($filename); //告诉浏览器返回的文件大小 header('accept-length: '.$filesize); //告诉浏览器文件作为附件处理,告诉浏览器最终下载完的文件名称 header('content-disposition: attachment;filename=king_'.basename($filename)); //读取文件中的内容 //规定每次读取文件的字节数为1024字节,直接输出数据 $read_buffer=1024; $sum_buffer=0; $handle=fopen($filename,'rb'); while(!feof($handle) && $sum_buffer<$filesize){ echo fread($handle,$read_buffer); $sum_buffer+=$read_buffer; } fclose($handle); exit; } //在具体页面调用时 require_once 'file.func.php'; $filename=$_get['filename']; down_file1($filename);
【文件上传函数封装】
/** * 单文件上传 * @method upload_file * @param array $fileinfo 上传文件的信息,是一个数组 * @param string $uploadpath 文件上传默认路径 * @param boolean $imageflag 是否检测真实图片 * @param array $allowext 允许上传的文件类型 * @return mixed 成功返回文件最终保存路径及名称,失败返回false */ function upload_file(array $fileinfo,string $uploadpath='./uploads',bool $imageflag=true,array $allowext=array('jpeg','jpg','png','gif'),int $maxsize=2097152){ define('upload_errs',[ 'upload_max_filesize'=>'超过了php配置文件中upload_max_filesize选项的值', 'form_max_size'=>'超过了表单max_file_size选项的值', 'upload_file_partial'=>'文件部分被上传', 'no_upload_file_select'=>'没有选择上传文件', 'upload_system_error'=>'系统错误', 'no_allow_ext'=>'非法文件类型', 'exceed_max_size'=>'超出允许上传的最大值', 'not_true_image'=>'文件不是真实图片', 'not_http_post'=>'文件不是通过http post方式上传上来的', 'move_error'=>'文件移动失败' ]); //检测是否上传是否有错误 if($fileinfo['error']===upload_err_ok){ //检测上传文件类型 $ext=strtolower(pathinfo($fileinfo['name'],pathinfo_extension)); if(!in_array($ext,$allowext)){ echo upload_errs['no_allow_ext']; return false; } //检测上传文件大小是否符合规范 if($fileinfo['size']>$maxsize){ echo upload_errs['exceed_max_size']; return false; } //检测是否是真实图片 if($imageflag){ if(@!getimagesize($fileinfo['tmp_name'])){ echo upload_errs['not_true_image']; return false; } } //检测文件是否通过http post方式上传上来的 if(!is_uploaded_file($fileinfo['tmp_name'])){ return upload_errs['not_http_post']; } //检测目标目录是否存在,不存在则创建 if(!is_dir($uploadpath)){ mkdir($uploadpath,0777,true); } //生成唯一文件名,防止重名产生覆盖 $uniname=md5(uniqid(microtime(true),true)).'.'.$ext; $dest=$uploadpath.directory_separator.$uniname; //移动文件 if(@!move_uploaded_file($fileinfo['tmp_name'],$dest)){ echo upload_errs['move_error']; return false; } echo '文件上传成功'; return $dest; }else{ switch($fileinfo['error']){ case 1: // $mes='超过了php配置文件中upload_max_filesize选项的值'; $mes=upload_errs['upload_max_filesize']; break; case 2: $mes=upload_errs['form_max_size']; break; case 3: $mes=uplaod_errs['upload_file_partial']; break; case 4: $mes=upload_errs['no_upload_file_select']; break; case 6: case 7: case 8: $mes=uplaod_errs['upload_system_error']; break; } echo $mes; return false; } } //在具体页面调用时 require_once 'file.func.php'; $fileinfo=$_files['myfile']; var_dump(upload_file($fileinfo));
【文件压缩与解压缩函数封装】
/** * 压缩单个文件 * @method zip_file * @param string $filename 文件名 * @return boolean true|false */ function zip_file(string $filename){ if(!is_file($filename)){ return false; } $zip=new ziparchive(); $zipname=basename($filename).'.zip'; //打开指定压缩包,不存在则创建,存在则覆盖 if($zip->open($zipname,ziparchive::create|ziparchive::overwrite)){ //将文件添加到压缩包中 if($zip->addfile($filename)){ $zip->close(); @unlink($filename); return true; }else{ return false; } }else{ return false; } } // var_dump(zip_file('22.txt')); // func_get_args // test1.zip /** * 多文件压缩 * @method zip_files * @param string $zipname 压缩包的名称,.zip结尾 * @param string $files 需要压缩文件名,可以是多个 * @return boolean true|false */ function zip_files(string $zipname,...$files){ //检测压缩包名称是否正确 $zipext=strtolower(pathinfo($zipname,pathinfo_extension)); if('zip'!==$zipext){ return false; } $zip=new ziparchive(); if($zip->open($zipname,ziparchive::create|ziparchive::overwrite)){ foreach($files as $file){ if(is_file($file)){ $zip->addfile($file); } } $zip->close(); return true; }else{ return false; } } // var_dump(zip_files('test1.zip','22.txt')); // var_dump(zip_files('test2.zip','doupload.php','download.html','upload.html')); /** * 解压缩 * @method unzip_file * @param string $zipname 压缩包名称 * @param string $dest 解压到指定目录 * @return boolean true|false */ function unzip_file(string $zipname,string $dest){ //检测要解压压缩包是否存在 if(!is_file($zipname)){ return false; } //检测目标路径是否存在 if(!is_dir($dest)){ mkdir($dest,0777,true); } $zip=new ziparchive(); if($zip->open($zipname)){ $zip->extractto($dest); $zip->close(); return true; }else{ return false; } } // var_dump(unzip_file('test2.zip','a'));
$_files 参数详解:
$_files["file"]["name"] – 被上传文件的名称
$_files["file"]["type"] – 被上传文件的类型
$_files["file"]["size"] – 被上传文件的大小,以字节计
$_files["file"]["tmp_name"] – 存储在服务器的文件的临时副本的名称
$_files["file"]["error"] – 由文件上传导致的错误代码
$_files["file"]["error"]中的["error"]值情况:
upload_err_ok
0:没有错误发生,文件上传成功
upload_err_ini_size
1:上传的文件超过了 php.ini 中 upload_max_filesize(默认情况为 2m) 选项限制的值
upload_err_form_size
2:上传文件的大小超过了 html 表单中 max_file_size 选项指定的值
upload_err_partial
3:文件只有部分被上传
upload_err_no_file
4:没有文件被上传
5:传文件大小为 0