PHP对文件和文件夹的操作
PHP对文件和文件夹的操作
1.文件夹的权限属性
模式 | 描述 |
---|---|
r | 具有浏览目录的权限。 |
w | 具有新建,删除,修改,移动目录内文件的权限。 |
x | 对目录了来说该用户具有进入目录的权限。 |
2.常用的文件夹函数
//先检测文件是否存在
$file=file_exists("C:\Users\李川\Desktop\c#.txt");
var_dump($file);
filesize(); //字节为单位,只统计文件大小
disk_free_space("C:"); //指定磁盘剩余空间
disk_total_space("C:"); //指定磁盘总空间
is_readable($file); //是否可读
is_writeable($file); //是否可写
is_executable($file); //是否可执行 .exe .sh
fileatime($file); //访问时间 都是返回时间戳
filemtime($file); //修改时间
filectime($file);//创建时间
stat($file); //以数组形式返回文件所有属性
clearstatcache(); //清除一次文件属性缓存
var_dump(basename($file)); //返回文件名和后缀
var_dump(dirname($file)); //返回给的路径,就是除去/filename.txt后的路径
脚本运行期间,文件状态如果发生改变,你读取了文件需要删除之前未改变的缓存clearstatcache();
2.1 当上传文件下载文件的时候,如何判断路径是/还是\
define('ROOT',dirname(__FILE__).DIRECTORY_SEPARATOR."upload");
echo ROOT;
DIRECTORY_SEPARATOR是一个返回跟操作系统相关的路径分隔符的php内置命令,在windows上返回\,而在linux或者类unix上返回/,就是这么个区别,通常在定义包含文件路径或者上传保存目录的时候会用到。
2.2 循环遍历目录
//$r=readdir($dir); //遍历文件目录,文件不存在返回false,存在的话指针会往下移
重点是:用到了readdir(dir);释放内存,
//返回类型: 资源 目录句柄
$dir=opendir('../static/images'); //打开一个文件夹,会返回目录句柄
readdir读取目录句柄,如果不为空,指针下移,继续读直到为false,所以我们在每次移动读取的时候输出一行文件名就可以了
**上代码:**简单版只判断当前目录下的文件,不过记得过滤掉. 和 …
<?php
//返回类型: 资源 目录句柄
$dir=opendir('../static/images');
if($dir){
while(($file=readdir($dir))!==false){
if($file!=='.'$$$file!=='..')
echo $file."<br/>";
}
closedir($dir); //释放资源
}else echo "打开目录失败!";
递归判断目录里面的目录等直到没有嵌套文件夹下有没有文件
<?php
function listdoc($dir){
if(is_dir($dir)){//判断是否是目录
if($hd = opendir($dir)){//是目录,则打开
while($file = readdir($hd)){//循环读取目录的文件
if((is_dir($dir.'/'.$file)) && ($file !='.') && ($file !='..')){//判断是否是目录,并且每个文件夹不是当前和上一级目录
echo '文件名:'.$file;
echo '<br>';
listdoc($dir.'/'.$file);//是目录则递归调用
}else{//不是目录
if($file !='.' && $file !='..'){
echo $file;
echo '<br>';
}
}
}
}
closedir($hd);
}else{
echo '不是一个目录';
}
}
listdoc(__DIR__);
2.3 统计目录大小
首先这个我们就需要递归
一个功能函数,因为返回的都是字节,所以我们来个函数转换看的舒服的单位
function count_size($bit)
{
$type = array('Bytes','KB','MB','GB','TB');
for($i = 0; $bit >= 1024; $i++)//单位每增大1024,则单位数组向后移动一位表示相应的单位
{
$bit/=1024;
}
return (floor($bit*100)/100).$type[$i];//floor是取整函数,为了防止出现一串的小数,这里取了两位小数
}
其实就是递归获取目录文件,多了在输出文件名的时候计算它的文件大小的步骤而已
function listdoc($dir,$size){
if(is_dir($dir)){//判断是否是目录
if($hd = opendir($dir)){//是目录,则打开
while($file = readdir($hd)){//循环读取目录的文件
if((is_dir($dir.'/'.$file)) && ($file !='.') && ($file !='..')){//判断是否是目录,并且每个文件夹不是当前和上一级目录
echo '文件名:'.$file;
echo '<br>';
listdoc($dir.'/'.$file,$size);//是目录则递归调用
}else{//不是目录
if($file !='.' && $file !='..'){
echo "文件名:".$file." "."文件大小:".count_size(filesize($file));
$size+=filesize($file);
echo '<br>';
}
}
}
}
closedir($hd);
return $size;
}else{
echo '不是一个目录';
}
}
$s=listdoc(__DIR__,0);
echo "该文件夹总大小:".count_size($s);
2.4 创建和删除目录
mkdir('./test609/1701'); //必须要有父级目录test609存在才能创建1701文件夹
rmdir('./test609/1701'); //非空就不能删除,首先清空最底层的文件
unlink(path);//删除普通文件
一般情况都是有多级目录的,所以需要递归实现
<?php
function Directory( $dir ){
return is_dir ( $dir ) or Directory(dirname( $dir )) and mkdir ( $dir , 0777);
}
Directory(__DIR__.'/hello/777');
实现思路大致如下,核心是短路运算
is_dir ( $dir ) or (Directory(dirname( $dir )) and mkdir ( $dir , 0777));
先判断目标目录是否存在,若存在,依or的短路特性,后面的整体被短路,跳过执行;若目标目录不存在,则执行后面的函数体:
Directory(dirname( $dir )) and mkdir ( $dir , 0777)
dirname(__DIR__.'/hello/777')); //输出会去掉最底层的名字
我考虑了一下先进行递归的用意:先执行递归,意在确认其父目录(dirname($dir))都已经创建完毕,使后面的mkdir()函数不会创建子目录时找不到父目录发出警告。
进入递归深处后,确认最深处的根目录存在后,从根目录向下依次创建目录。
删除目录 (递归实现)
function rmdirs($dir){
if (!is_dir($dir) || rmdir($dir)) return TRUE; //如果是文件,或者直接删除文件夹能成功就直接删除
if($dir_handle=opendir($dir)){ //如果是文件夹,要去打开它的资源句柄
while($filename=readdir($dir_handle)){ //读取文件夹下的东西
if($filename!='.' && $filename!='..'){
$subFile=$dir.'/'.$filename; //拼接文件名路径
}
is_dir($subFile)?rmdirs($subFile):unlink($subFile); //如果是文件就继续递归判断,如果是普通文件就删除
}
closedir($dir_handle);
return rmdir($dir);
}
}
rmdirs(__DIR__.'/hello/777');
3.对文件的操作
//读取本地文件
$filename=__DIR__.'/www5.php';
$content=file_get_contents($filename);
$filename="https://www.runoob.com/php/php-file.html"; //远程读取 需要配置php.ini 远程url open
$content=file_get_contents($filename);
echo ($content);
写入内容
//写入内容 路径加内容,这样会覆盖,文件不存在会创建
file_put_contents($filename,"<?php echo '123'; ");
//FILE_APPEND 追加内容到末尾
file_put_contents($filename,"<?php echo '123'; ",FILE_APPEND);
打开文件
3.1 文件的权限属性
模式 | 描述 |
---|---|
r | 只读。在文件的开头开始。 |
r+ | 读/写。在文件的开头开始。 |
w | 只写。打开并清空文件的内容;如果文件不存在,则创建新文件。 |
w+ | 读/写。打开并清空文件的内容;如果文件不存在,则创建新文件。 |
a | 追加。打开并向文件末尾进行写操作,如果文件不存在,则创建新文件。 |
a+ | 读/追加。通过向文件末尾写内容,来保持文件内容。 |
x | 只写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。 |
x+ | 读/写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。 |
//只读打开文件
fopen($filename,'r'); //后面这个参数你可以参考文权限属性
//以读写方式打开文件
$open=fopen($filename,'r+');
var_dump(fread($open,"3"));
fwrite($open,"写在哪里了"); //会覆盖,如果读取了长度再写,就只会覆盖后面没有读取的内容
fclose($open);