1 <html> 2 <body> 3 <?php 4 function traverse($path = '.') { 5 $current_dir = opendir($path); //opendir()返回一个目录句柄,失败返回false 6 while(($file = readdir($current_dir)) !== false) { //readdir()返回打开目录句柄中的一个条目 7 $sub_dir = $path . DIRECTORY_SEPARATOR . $file; //构建子目录路径 8 if($file == '.' || $file == '..') { 9 continue; 10 } else if(is_dir($sub_dir)) { //如果是目录,进行递归 11 echo 'Directory ' . $file . ':<br>'; 12 traverse($sub_dir); 13 } else { //如果是文件,直接输出 14 echo 'File in Directory ' . $path . ': ' . $file . '<br>'; 15 } 16 } 17 } 18 19 traverse('xxtt'); 20 ?> 21 </body> 22 </html>
页面输出
Directory autoload:
File in Directory d:wwwautoload: MyClass.php
File in Directory d:wwwautoload: MyClass2.php
File in Directory d:wwwautoload: test.php
File in Directory d:www: changelog.txt
File in Directory d:www: cryptForm.php
File in Directory d:www: diffDomain.php
Directory ExamingOnline:
Directory New folder:
File in Directory d:www: example.php
File in Directory d:www: example2.php
Directory Excel:
File in Directory d:wwwExcel: oleread.inc
File in Directory d:wwwExcel: oleread.php
File in Directory d:wwwExcel: reader.php
File in Directory d:www: expert.xls
File in Directory d:www: expert.xlsx
File in Directory d:www: index.php
File in Directory d:www: index2.php
File in Directory d:www: jxlrwtest.xls
File in Directory d:www: lcs.php
Directory listFile:
File in Directory d:wwwlistFile: listFile.php
File in Directory d:www: nQueens.php
Directory proxypass:
Directory proxy:
File in Directory d:wwwproxypassproxy: login.php
File in Directory d:wwwproxypassproxy: result.php
File in Directory d:wwwproxypass: success.php
File in Directory d:www: README
File in Directory d:www: somefile0.php
Directory Study:
Directory .idea:
File in Directory d:wwwStudy.idea: .name
File in Directory d:wwwStudy.idea: encodings.xml
File in Directory d:wwwStudy.idea: misc.xml
File in Directory d:wwwStudy.idea: modules.xml
File in Directory d:wwwStudy.idea: Study.iml
File in Directory d:wwwStudy.idea: vcs.xml
File in Directory d:wwwStudy.idea: workspace.xml
File in Directory d:wwwStudy: NSquare.php
File in Directory d:wwwStudy: regular.php
Directory templates:
File in Directory d:wwwStudy emplates: tpl.php
Directory templates_c:
File in Directory d:wwwStudy emplates_c: com_tpl.html.php
File in Directory d:wwwStudy emplates_c: com_tpl.php.php
File in Directory d:wwwStudy: test.php
Directory sub:
File in Directory d:wwwsub: index.php
Directory template:
File in Directory d:www emplate: template.php
Directory templates:
File in Directory d:www emplate emplates: tpl.html
Directory templates_c:
File in Directory d:www emplate emplates_c: com_tpl.html.php
Directory test:
Directory adodb5:如果要遍历某个目录下的所有文件(包括子目录),最首先想到的思路就是用递归:先处理当前目录,再处理当前目录下的子目录。不用递归可不可以呢?以前学数据结构的时候看到过,递归其实是利用堆栈来实现的,递归的特点就是不断的调用自身,最后一次的调用是最先执行完的,倒数第二次调用是其次执行完的,依次类推,最初的调用是最后执行完的。如果理解了递归的原理,其实就可以把所有用递归的实现转化为非递归的实现。
用非递归方式遍历某个目录下的所有文件,思路主要分三步:
1. 创建一个数组,将要遍历的这个目录放入;(其实就是创建了一个栈)
2. 循环处理这个数组,循环结束的条件是数组为空;
3. 每次循环,处理数组中的一个元素,并将元素删除,如果这个元素是目录,则将目录下所有的子元素加入数组;按照这种思路写出的代码如下:
/** * 遍历某个目录下的所有文件 * @param string $dir */ function scanAll($dir) { $list = array(); $list[] = $dir; while (count($list) > 0) { //弹出数组最后一个元素 $file = array_pop($list); //处理当前文件 echo $file." "; //如果是目录 if (is_dir($file)) { $children = scandir($file); foreach ($children as $child) { if ($child !== '.' && $child !== '..') { $list[] = $file.'/'.$child; } } } } }