php 遍历文件夹文件问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php 遍历文件夹文件问题相关的知识,希望对你有一定的参考价值。

现在我有这样的需求: 遍历C盘下所有的文件和文件夹(或者某个目录下所有的文件和文件夹),并且获取所有目录的名字和路径、每个目录下的文件的名字和路径存储起来,现在我不管后面的存储,只想知道如何可以遍历、获取名字、路径的方法?求高手!!

<?php
//脚本根目录
define ( \'S_ROOT\', dirname ( __FILE__ ) . DIRECTORY_SEPARATOR );
//递归查找搜索文件
function glob_recursive($pattern, $flags = 0)
$files = glob ( $pattern, $flags );

foreach ( glob ( dirname ( $pattern ) . \'/*\', GLOB_ONLYDIR | GLOB_NOSORT ) as $dir )
$files = array_merge ( $files, glob_recursive ( $dir . \'/\' . basename ( $pattern ), $flags ) );


return $files;

//如果搜索所有文件可用 S_ROOT.\'image/\'."*.*"
//如果只是某一类文件可以 S_ROOT.\'image/\'."*.gif"
$filelist = glob_recursive(S_ROOT.\'image/\'."*.gif");
foreach ($filelist as $file)
echo \'目录 \'.dirname($file).\' 路径 \'. $file.\'<br />\';

?>

执行脚本结果类似下图

参考技术A /**
* 列出目录下所有文件
* @param string $path 路径
* @param string $exts 扩展名
* @param array $list 增加的文件列表
* @return array 所有满足条件的文件
*/
function dir_list($path, $exts = '', $list = array())

$path = str_replace('\\', '/', $path);
substr($path, -1) != '/'?$path = "$path/":"";
$files = glob($path.'*');
if ($files)
foreach($files as $v)
if (empty($exts) || pathinfo($v, PATHINFO_EXTENSION) == $exts)
$list[] = $v;
if (is_dir($v))
$list = dir_list($v, $exts, $list);




return $list;
参考技术B

主要思想还是使用递归的方式,判断如果是目录,则重新使用函数,如果不是目录,就直接显示文件路径。

但是在递归的时候要注意排除两个特殊的目录'.'和'..'如果不考虑这个,程序容易陷入死循环

function getdir($path)

if (!is_dir($path))
return;
$handle = dir($path);
while ($file = $handle->read())
if ($file != \'.\' && $file != \'..\')
$path2 = $path . \'/\' . $file;
if (is_dir($path2))
echo "目录".$file . "<br />";
getdir($path2);
else
echo $path2 . \'<br />\';




getdir("这里添加路径");

php递归遍历文件夹


用递归实现遍历文件夹及其子目录 * ###什么是递归 **递归: 函数不断的调用函数,开辟内存: 是一种典型使用空间换时间的思想(突然间内存被大量占用,效率很高)。

当一个函数是为了解决某一个问题的时候, 发现在解决的过程中, 出现了子问题与本身要解决的问题(父问题)一致: 子问题与父问题一致,只是规模比较小.

如果碰到了相同的问题, 可以使用父问题的解决方案去解决子问题: 调用函数自己

###递归有两个要素

1 递归点: 解决父问题过程中,发现了子问题与父问题一致: 递归点: 递归调用函数

2 递归出口: 保证函数能够结束的地方就是递归出口

###思路

  1. 使用函数解决当前需要解决的问题: 不考虑子问题

  2. 寻找递归点: 函数在解决问题的过程中,有没有碰到与父问题相似的问题: 父问题是遍历文件夹: 子问题: 遍历出来的文件刚好又是文件夹
  3. 消除产生死递归的要素: .和..文件夹: 一个代表当前,一个代表上级

  4. 递归调用函数: 解决子问题

  5. 寻找递归出口: 整个文件夹遍历结束也没有发现文件夹:都是文件或者.和..文件夹

  6. 增加子文件的缩进: 子文件夹的遍历都是由上一级发展而来: 如果能够在每一层使用scandir的地方,定义一个层级来控制: 就可以描述当前层级是属于第几级,级别代表当前所属哪层一层文件夹: 级别就代表着缩进

###代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
	/*
	 * 实现遍历文件夹及其子目录
	 * @param1 string $dir,要获取文件的路径
	 * @param1 int $level=0,缩进层级
	 * @return 失败返回false 成功返回遍历结果
	*/
	function myscandir($dir, $level = 0)
		//判断路径是否合法
		if(!is_dir($dir)) return false;
		//取出该路径下的所有文件名(以数组的形式)
		$files = scandir($dir);
		//遍历数组
		foreach($files as $file)
			//剔除.与..目录
			if($file != '.' && $file != '..')		
				//构造新路径
				$new_dir = $dir . '/' . $file;
				//判断输出
				if(is_file($new_dir))
					//是文件,则以蓝色字体输出
					echo str_repeat('&nbsp;&nbsp', $level * 2),"<font color='blue'>$file</font><br/>";
				else
					//是路径,则以红色字体输出并继续遍历
					echo str_repeat('&nbsp;&nbsp', $level * 2),"<font color='red'>$file</font><br/>";
					//递归点
					myscandir($new_dir, $level + 1);
				
			
		
	

打完收工:p


原文:大专栏  php递归遍历文件夹


以上是关于php 遍历文件夹文件问题的主要内容,如果未能解决你的问题,请参考以下文章

php遍历文件夹是先文件夹还是文件

php写一个函数,能够遍历一个文件夹下的所有文件和子文件夹

PHP 和 XML。使用 PHP 循环遍历 XML 文件

PHP遍历并打印指定目录下所有文件实例

php递归遍历文件夹

php 循环遍历文件夹下面的所有目录及文件并且每个文件都写入一句话