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)closedir(dir),会遍历,操作完closedir(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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章