PHP获取目录文件列表


用PHP获取指定目录的文件列表,常见的有2种方法:

  1. 主要用到PHP的dir()/is_dir()函数;
  2. 用到PHP的opendir()/readdir()/closedir()/realpath()/is_dir()等函数。
方法一:
<?php
print_r(getDirFiles("./", true, true));
print_r(getDirFiles("./", true));

function getDirFiles($path,$subDir=false/*是否遍历子目录*/,$addDir=false/*是否输出文件夹*/) {
	$mydir=dir($path);
	$all=array();
	while( ($file=$mydir->read())!==false){
		if($file=="." || $file==".."){
			continue;
		}
		if ( is_dir( $path.$file ."/") ) {
			if($addDir) {
				$all[]=$path.$file ."/";
			}
			if($subDir) {
				$temp=getDirFiles( $path.$file ."/" ,$sub );
				$all=array_merge($all,$temp);
			}

		} else {
			$all[]= $path.$file ;
		}
	}
	return $all;
}
?>
方法二:
<?php
/*
*递归获取指定路径下的所有文件或匹配指定正则的文件(不包括“.”和“..”),结果以数组形式返回
*	@param	string	$dir
*	@param	string	$pattern
*	@return	array
*/
function file_list($dir,$pattern="")
{
	$arr=array();
	$dir_handle=opendir($dir);
	if($dir_handle)
	{
		// 这里必须严格比较,因为返回的文件名可能是“0”
		while(($file=readdir($dir_handle))!==false)
		{
			if($file==='.' || $file==='..')
			{
				continue;
			}
			$tmp=realpath($dir.'/'.$file);
			if(is_dir($tmp))
			{
				$retArr=file_list($tmp,$pattern);
				if(!empty($retArr))
				{
					$arr[]=$retArr;
				}
			}
			else
			{
				if($pattern==="" || preg_match($pattern,$tmp))
				{
					$arr[]=$tmp;
				}
			}
		}
		closedir($dir_handle);
	}
	return $arr;
}

// 列出当前目录下所有以".php"扩展名(不区分大小写)结尾的文件
echo '<pre>';
print_r(file_list(dirname(__FILE__),'/.php$/i'));
echo '</pre>';
?>
附录一:用PHP获取当前目录的方法
<?php

// 获取当前目录
echo realpath(".")."n";
echo getcwd() . "n";
echo dirname(__file__) . "n";	//PHP 常量

// 获取上级目录
echo realpath(".."). "n";
echo dirname(dirname(__FILE__)) . "n";	//取得当前文件的上一层目录

// 获取网站根目录
echo $_SERVER['DOCUMENT_ROOT'] . "n";

// 获取目录信息
$path_parts = pathinfo(__FILE__);
echo $path_parts["dirname"] . "n";	//目录名
echo $path_parts["basename"] . "n";//文件名
echo $path_parts["extension"] . "n";//扩展名
echo dirname(__FILE__) . "n";//目录名--PHP常量

?>
附录二:批量重命名文件(去掉.bak的后缀)
<?php
//php批量重命名文件(去掉.bak)
function foreachDir($path){
	if(!is_dir($path)){
		echo "{$path}不是一个有效的目录!";
		exit();
	}
	$handle=opendir($path);
	if($handle){
		while (($file = readdir($handle))!==false) {
			if($file!='.' && $file!='..'){
				if(is_dir($path.$file)){
					echo $path.$file."<br/>n";
					foreachDir($path.$file);
				} else{
					$bak = pathinfo($file);
					if($bak[extension]==bak){
						$ext = strripos($file,'.');
						$newname = substr($file,0,$ext);
						echo $path.'/'.$file.'---'.$path.'/'.$newname."<br/>n";
						rename($path.'/'.$file,$path.'/'.$newname);
					}
				}
			}
		}
		return false;
	}
}

foreachDir('./');
?>

差不多就这些方法了~

补充:
function deleteDirAndFile( $dirName )//递归删除指定目录
{
	if ( $handle = opendir( "$dirName" ) ) {
		while (  ($item = readdir( $handle ))!==false  ) {
			if ( $item != "." && $item != ".." ) {
				if ( is_dir( "$dirName/$item" ) ) {
					deleteDirAndFile( "$dirName/$item" );
				} else {
					@unlink( "$dirName/$item" );//删除文件unlink()
				}
			}
	   }
	   closedir( $handle );
	   @rmdir( $dirName );	//rmdir()删除指定的目录,该目录必须是空的,而且要有相应的权限
	}
}
再补充一个:
<?php

function getDirFiles($path,$subDir=false/*是否遍历子目录*/,$printDir=false/*是否输出文件夹*/) {
	$mydir=dir($path);
	$all=array();
	while( ($file=$mydir->read())!==false){
		if($file=="." || $file==".."){
			continue;
		}
		if ( is_dir( $path.DIRECTORY_SEPARATOR.$file) ) {
			if($printDir) {
				$all[]=$path.DIRECTORY_SEPARATOR.$file;
			}
			if($subDir) {
				$temp=getDirFiles( $path.DIRECTORY_SEPARATOR.$file, $subDir );
				$all=array_merge($all,$temp);
			}

		} else {
			$all[]= $path.DIRECTORY_SEPARATOR.$file ;
		}
	}
	return $all;
}
print_r(getDirFiles(getcwd()), true);



$filelist = array();
function get_file_list($dbsource) {
	global $filelist;
	$current_file_list = glob($dbsource);
	foreach ($current_file_list as $each) {
		if (strpos($each, 'search.php') === true)
			continue;
		if (is_file($each))
			$filelist[] = $each;
		if (is_dir($each))
			get_file_list($each . '\*');
	}
}
get_file_list(getcwd() . '\*');
print_r($filelist);



function getDirFiles_r($path){
	$mydir = opendir($path);
	$all = array();
	while ( false !== ($file=readdir($mydir)) ){
		if($file == "." || $file == ".."){
			continue;
		}
		$tmp = $path.DIRECTORY_SEPARATOR.$file;
		if( is_dir($tmp) ){
			$temp = getDirFiles_r($tmp);
			$all = array_merge($all, $temp);
		} else {
			$all[] = $tmp;
		}
	}
	return $all;
}
print_r(getDirFiles_r(getcwd()));

?>

 


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注