PHP 目录处理相关函数


文件处理相关函数挺多的,有时碰到或想用时又要查一下,所以这里总结下。


正文

方法一览

目录函数:

函数 描述
chdir() 改变当前的目录。
chroot() 改变根目录。
closedir() 关闭目录句柄。
dir() 返回 Directory 类的实例。
getcwd() 返回当前工作目录。
opendir() 打开目录句柄。
readdir() 返回目录句柄中的条目。
rewinddir() 重置目录句柄。
scandir() 返回指定目录中的文件和目录的数组。

文件系统函数:

函数 描述 PHP
basename() 返回路径中的文件名部分。 3
dirname() 返回路径中的目录名称部分。 3
disk_free_space() 返回目录的可用空间。 4
disk_total_space() 返回一个目录的磁盘总容量。 4
diskfreespace() disk_free_space() 的别名。 3
file_exists() 检查文件或目录是否存在。 3
glob() 返回一个包含匹配指定模式的文件名/目录的数组。 4
is_dir() 判断指定的文件名是否是一个目录。 3
mkdir() 创建目录。 3
pathinfo() 返回关于文件路径的信息。 4
realpath() 返回绝对路径名。 4
rename() 重名名文件或目录。 3
rmdir() 删除空的目录。 3

解说

/**
 * 文件写入
 * @access public
 * @param string $filename  文件名
 * @param string $content  文件内容
 * @param string $type  默认覆盖,追加:FILE_APPEND
 * @return boolean
 */
function putContents($filename, $content = "", $type = null)
{
    $dir =  dirname($filename);
    if (!is_dir($dir)) {
        mkdir($dir, 0777, true);
    }

    if (false === file_put_contents($filename, $content, $type)) {
        // 写入错误日志文件
    }
}

实例

举几个例子作为开始吧。

一、PHP遍历某个目录下的所有文件和子文件夹的实现代码

方法1,打印在页面上:

function traverse_dir( $path = '.' )
{
     $current_dir = opendir( $path );
     // opendir()返回一个目录句柄,如 resource(3) of type (stream) ,失败返回false,
     while( ( $file = readdir($current_dir) ) !== false ) {
          // readdir()返回打开目录句柄中的一个条目
          $sub_dir = $path . DIRECTORY_SEPARATOR . $file; // 构建子目录路径
          if ( $file == '.' || $file == '..' ) {
               continue;
          } else if ( is_dir($sub_dir) ) { // 如果是目录,进行递归
               echo 'Directory ' . $file . ':';
               traverse_dir( $sub_dir );
          } else { // 如果是文件,直接输出
               echo 'File in Directory ' . $path . ': ' . $file;
          }
     }
}

traverse_dir(__DIR__);
// 输出如下
//File in Directory /var/www/kk/www: curlread.php
//File in Directory /var/www/kk/www: favicon.ico
//File in Directory /var/www/kk/www: index.html
//File in Directory /var/www/kk/www: index.php
//Directory logs:
//File in Directory /var/www/kk/www/logs: kk.log
//Directory Public:
//Directory css:
//File in Directory /var/www/kk/www/Public/css: account.css
//File in Directory /var/www/kk/www/Public/css: cd.css
//File in Directory /var/www/kk/www/Public/css: detail-jd.css
//File in Directory /var/www/kk/www/Public/css: entrance.css
//File in Directory /var/www/kk/www/Public/css: global.css
//File in Directory /var/www/kk/www/Public/css: guide.css
//Directory images:
//File in Directory /var/www/kk/www/Public/css/images: animated-overlay.gif
//File in Directory /var/www/kk/www/Public/css/images: chicang.png
//File in Directory /var/www/kk/www/Public/css/images: di_mq.png

方法2,储存在数组里返回:

function read_all_dir( $dir = '.' )
{
     $result = array();
     $handle = opendir( $dir );
     if ( $handle ) {
          while ( ( $file = readdir( $handle ) ) !== false ) {
               if ( $file != '.' && $file != '..') {
                    $cur_path = $dir . DIRECTORY_SEPARATOR . $file;
                    if ( is_dir( $cur_path ) ) {
                         $result['dir'][$cur_path] = read_all_dir ( $cur_path );
                    } else {
                         $result['file'][] = $cur_path;
                    }
               }
          }
          closedir($handle);
     }
     return $result;
}

$result = read_all_dir(__DIR__);

// 返回如下
array(2) {
     ["file"]=>
          array(4) {
               [0]=>
                    string(38) "/var/www/kk/www/curlread.php"
               [1]=>
                    string(37) "/var/www/kk/www/favicon.ico"
               [2]=>
                    string(36) "/var/www/kk/www/index.html"
               [3]=>
                    string(35) "/var/www/kk/www/index.php"
          }
     ["dir"]=>
          array(2) {
               ["/var/www/kk/www/logs"]=>
                    array(1) {
                         ["file"]=>
                              array(1) {
                                   [0]=>
                                        string(37) "/var/www/kk/www/logs/kk.log"
                              }
                    }
               ["/var/www/kk/www/Public"]=>
                    array(1) {
                         ["dir"]=>
                              array(1) {
                                   ["/var/www/kk/www/Public/css"]=>
                                        array(1) {
                                             ["file"]=>
                                                  array(4) {
                                                       [0]=>
                                                       string(48) "/var/www/kk/www/Public/css/account.css"
                                                       [1]=>
                                                       string(43) "/var/www/kk/www/Public/css/cd.css"
                                                       [2]=>
                                                       string(50) "/var/www/kk/www/Public/css/detail-jd.css"
                                                       [3]=>
                                                       string(49) "/var/www/kk/www/Public/css/entrance.css"
                                                  }
                                        }
                              }
                    }
          }
} 

方法3,用dir()返回对象方式:

function traverse_dir( $path = '.' )
{
     $mydir = dir($path);
      // dir() 返回Directory 类的实例,如object(Directory)#1 (2) { ["path"]=> string(25) "/var/www/kk/www" ["handle"]=> resource(3) of type (stream) }  
     while ( $file = $mydir->read() )
     {
          if ( ( is_dir("$path/$file") ) AND ($file!=".") AND ($file!="..") ) {
               traverse_dir( "$path/$file" );
          } else {
               echo "$file";
          }
     }
     $mydir->close();
}

traverse_dir(__DIR__);

返回如下

方法4,用scandir()列出目录中的文件和目录:

function traverse_dir( $path = '.' )
{
     // scandir() 函数返回指定目录中的文件和目录的数组
     foreach ( scandir($path) as $afile ) {
          if ( $afile=='.'||$afile=='..' ) continue;
          if ( is_dir($path.'/'.$afile) ) {
               traverse_dir( $path.'/'.$afile );
          } else {
               echo $path.'/'.$afile;
          }
     }
}

traverse_dir(__DIR__);
// 返回如下
// /var/www/kk/www/Public/js/skin/layer.css
// /var/www/kk/www/Public/js/skin/layer.ext.css
// /var/www/kk/www/Public/js/swiper.min.js
// /var/www/kk/www/Public/websocket/WebSocket.js
// /var/www/kk/www/Public/websocket/echarts.bak.min.js
// /var/www/kk/www/Public/websocket/echarts.js
// /var/www/kk/www/Public/websocket/echarts.min.js
// /var/www/kk/www/Public/websocket/reconnecting-websocket.js
// /var/www/kk/www/Public/websocket/reconnecting-websocket.min.js
// /var/www/kk/www/Public/websocket/worker.js
// /var/www/kk/www/curlread.php
// /var/www/kk/www/favicon.ico
// /var/www/kk/www/index.html
// /var/www/kk/www/index.php
// /var/www/kk/www/logs/kk.log 

方法5,用glob() :

function traverse_dir( $path = '.' )
{
     // glob()返回的内容中已经过滤掉了'.'和'..',其中*表示遍历目录下所有文件。
     // 相应的,如果改为*.txt,则会遍历目录下所的txt文件
     foreach ( glob($path) as $afile ) {
          if ( is_dir($afile) ) {
               traverse_dir( $afile.'/*' );
          } else {
               echo $afile;
          }
     }
}

traverse_dir(__DIR__);
// 返回如下
// /var/www/kk/www/Public/js/skin/layer.css
// /var/www/kk/www/Public/js/skin/layer.ext.css
// /var/www/kk/www/Public/js/swiper.min.js
// /var/www/kk/www/Public/websocket/WebSocket.js
// /var/www/kk/www/Public/websocket/echarts.bak.min.js
// /var/www/kk/www/Public/websocket/echarts.js
// /var/www/kk/www/Public/websocket/echarts.min.js
// /var/www/kk/www/Public/websocket/reconnecting-websocket.js
// /var/www/kk/www/Public/websocket/reconnecting-websocket.min.js
// /var/www/kk/www/Public/websocket/worker.js
// /var/www/kk/www/curlread.php
// /var/www/kk/www/favicon.ico
// /var/www/kk/www/index.html
// /var/www/kk/www/index.php
// /var/www/kk/www/logs/kk.log 






参考资料

PHP 手册 函数参考 文件系统相关扩展 目录 目录函数函数 https://www.php.net/manual/zh/ref.dir.php

PHP 5 Directory 函数 https://www.runoob.com/php/php-ref-directory.html

PHP 手册 函数参考 文件系统相关扩展 文件系统 文件系统函数 https://www.php.net/manual/zh/ref.filesystem.php

PHP Filesystem 函数

http://www.w3school.com.cn/php/php_ref_filesystem.asp

http://www.runoob.com/php/php-ref-filesystem.html

http://www.cnblogs.com/zemliu/archive/2012/05/04/2482614.html

http://www.w3school.com.cn/php/php_ref_directory.asp

http://www.w3school.com.cn/php/func_directory_dir.asp

http://www.jb51.net/article/43186.htm

http://www.w3school.com.cn/php/func_filesystem_glob.asp


返回