详谈PHP文件目录基础操作(2)_PHP教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

推荐:PHP获取数组中重复最多的元素的实现方法
本文实例讲述了PHP获取数组中重复最多的元素的实现方法。分享给大家供大家参考。具体方法如下: 代码如下:?php /** * * Created on 2014-4-1 * @param array $array * @param int [optional] $length * @return array */ function mostRepeatedValues($array,$length=0

 

代码如下:
<?php
// 目录的读取
$dir = 'F:/';
echo 'details in '.$dir.'<br>';
if(is_dir($dir)){
if(($handle = opendir($dir)) == false){ // 获取目录句柄
echo 'open dir failed';
return;
}
while(($name = readdir($handle)) != false){ // 循环读取该目录下内容
$filepath = $dir.'/'.$name;
echo 'name: '.$name.' type: '.filetype($filepath).'<br>';
}
closedir($handle); // 关闭目录句柄
}
else{
echo $dir.' is not a directory<r>';
}

 

效果如下:

详谈PHP文件目录基础操作 模板无忧

可以看到实际上,系统给目录中内容进行了忽略大小写的字典排序。

目录的大小计算,我们知道文件的大小可以由filesize取得,但是php中没有专门计算目录大小的函数。当然php中有计算硬盘大小的函数disk_total_space(计算硬盘总空间)、disk_free_space(计算硬盘可用空间),但是我试了下disk_free_space,貌似计算得不对。正因为有filesize计算文件的大小,因此,需要用到递归,当是目录时,进去继续计算子目录的大小,如果是文件,获取到文件大小并加上返回,代码如下:

 

代码如下:
<?php
// 目录大小计算
function getDirSize($dirpath){
$size = 0;
if(false != ($handle = opendir($dirpath))){
while(false != ($file = readdir($handle))){
if($file == '.' || $file == '..') //注意过滤目录中自带的点和点点
continue;
$filepath = $dirpath.'/'.$file; // 前面要接上路径
if(is_file($filepath)){ // 是文件计算大小
$size += filesize($filepath);
}
else if(is_dir($filepath)){ // 是目录继续计算该目录下的文件
$size += getDirSize($filepath);
}
else{
$size += 0;
}
}
closedir($handle);
}
return $size;
}
$dirsize = 'F:/size';
$size = getDirSize($dirsize);
echo 'dir size: '.getSize(null, $size).'<br><br>'; // 调用前面的数据处理函数

 

我在F盘建了个size文件,随便弄了点子目录和文档,效果如下,左边是程序求得,右边是右键查看文件夹属性得到的,用以对比。

详谈PHP文件目录基础操作 详谈PHP文件目录基础操作

目录的新建和删除,主要用到,mkdir:新建一个目录,rmdir:删除一个非空目录,注意只能是非空,代码如下:

 

代码如下:
<?php
// 目录的新建和删除
$newDirPath = 'F:/newDir';
if(true == @mkdir($newDirPath, 0777, true)){ // 加@是因为文件已存在时php本身可能会抛出一个warning
echo 'create directory '.$newDirPath.' successfully<br>';
}
else{
if(file_exists($newDirPath))
echo 'directory '.$newDirPath.' has existed<br>';
else
echo 'create directory '.$newDirPath.' failed<br>';
}
if(true == @rmdir('F:/aaa')) //只能删除非空目录,如果删除不存在的目录自动抛出warning
echo 'remove successfully<br>';

 

那么问题来了,如果要删除一个非空目录咋办,又得自己写了,思想仍然是递归,因为php只提供了删除文件函数unlink,所以在删除一个目录时,先opendir,再进入,如果是文件直接删除,如果是目录,继续进入使用该方法处理,当然还可已返回一个bool变量表示删除是否成功,代码如下:

 

代码如下:
<?php
// 删除文件 unlink
// 删除目录中的内容,然后删除该目录
function clearDir($dirpath){
if(file_exists($dirpath)){
if(false != ($handle = opendir($dirpath))){
while(false != ($name = readdir($handle))){
if($name == '.' || $name == '..')
continue;
$filename = $dirpath.'/'.$name;
if(is_dir($filename))
clearDir($filename);
if(is_file($filename))
@unlink($filename);
}
closedir($handle);
rmdir($dirpath);
}
else{
return false;
}
}
else{
return false;
}
return true;
}

 

在这里不得不说遇到的一个大坑,就是 . 和 .. 这两个鬼玩意儿(点和点点),在操作系统中的每一个文件夹下边,都会有 . 和 .. ,它们表示当前目录和当前目录的上级目录,可恶的是前面在读取目录时居然没显示,导致递归函数成了死循环,因为 . 和 .. 在每一个目录的最前面,必然会先读到它俩,若不过滤,首先读到 . ,它表示本目录,然后又递归进入本目录...这俩是操作系统下面的默认有的,它们是本目录与上级目录的连接符。

通过计算目录的大小和删除非空目录的代码,写复制和剪切目录就非常容易,非常相似的递归思想,需要用到复制文件函数copy,文件移动函数rename,这个挺有趣,rename,字面上是重命名,但是重命名到另一个目录中不就是剪切了么-_-

3.文件读写

php的某些文件读取操作跟C语言非常像,所以也比较简单,步骤就是先打开文件获取句柄,检查错误,然后读写处理,然后关闭,养成打开处理完后就关闭的好习惯,记得在C语言中的文件不关闭的话,打开两次是会报错滴,不知道记错没,所以严格点的程序都有非常多的处理,比如先验证文件存在,然后验证可读可写性,然后先关闭一下,然后再打开,打开时还得再检查打开错了没......在打开文件时,就要选择打开文件的模式,它决定了我们读还是写文件,当然是对需要这样操作的函数有用。

分享:php的curl封装类用法实例
使用函数之前我们要需要把php curl模块打开(libeay32.dll, ssleay32.dll, php5ts.dll, php_curl.dll) 开启php curl函数库的步骤 1).去掉windows/php.ini 文件里;extension=php_curl.dll前面的; /*用 echo phpinfo();查看php.ini的路径*/ 2).把php5/libeay32.dll,sslea

来源:模板无忧//所属分类:PHP教程/更新时间:2014-11-13
相关PHP教程