欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PHP对文件和文件夹的操作

程序员文章站 2022-05-14 22:56:18
...

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);
相关标签: php