PHP递归目录路径
问题描述:
我有这个函数返回full directory tree
:PHP递归目录路径
function getDirectory($path = '.', $level = 0){
$ignore = array('cgi-bin', '.', '..');
// Directories to ignore when listing output. Many hosts
// will deny PHP access to the cgi-bin.
$dh = @opendir($path);
// Open the directory to the handle $dh
while(false !== ($file = readdir($dh))){
// Loop through the directory
if(!in_array($file, $ignore)){
// Check that this file is not to be ignored
$spaces = str_repeat(' ', ($level * 4));
// Just to add spacing to the list, to better
// show the directory tree.
if(is_dir("$path/$file")){
// Its a directory, so we need to keep reading down...
echo "<strong>$spaces $file</strong><br />";
getDirectory("$path/$file", ($level+1));
// Re-call this same function but on a new directory.
// this is what makes function recursive.
} else {
echo "$spaces $file<br />";
// Just print out the filename
}
}
}
closedir($dh);
// Close the directory handle
}
,但我想要做的就是寻找一个文件/文件夹,并返回它的路径,我怎么能去做?你有这样的功能,或者你能给我一些关于如何做到这一点的提示吗?
答
尝试组合使用RecursiveIteratorIterator与RecursiveDirectoryIterator
$path = realpath('/path/you/want/to/search/in');
$objects = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($path),
RecursiveIteratorIterator::SELF_FIRST);
foreach($objects as $name => $object){
if($object->getFilename() === 'work.txt') {
echo $object->getPathname();
}
}
补充阅读:
答
你有这样的功能,或者你可以给我一些提示关于如何做 这个?
是的。
今天早上我其实问了一个类似的问题,但我知道了。我遇到的问题是文件名。和..是由readdir()返回的,它们在尝试使用opendir()时会导致问题。当我将这些过滤掉时,我的递归完美运作。您可能需要修改其输出适合搜索的目录的格式。或者修改它以输出所有文件和目录。找到“go.jpg”的图片并尝试一下。
我找不到我的帖子来通知我找到了解决方案。
define ('HOME', $_SERVER['DOCUMENT_ROOT']);
function searchalldirectories($directory, $seachterm, $maxrecursions, $maxopendir){
$dircontent= '';
$dirs= array();
if ($maxopendir > 0){
$maxopendir--;
$handle= opendir(HOME.'/'.$directory);
while (($dirlisting= readdir($handle)) !== false){
$dn= ''; $fn= ' File';
if (is_dir(HOME.'/'.$directory.'/'.$dirlisting) && $maxrecursions>0 && strpos($dirlisting, '.')!==0){
$dirs[ count($dirs)]= $directory.'/'.$dirlisting;
$dn= '/'; $fn= 'Dir';
}
if (stripos($dirlisting, $seachterm) !== false){
$dircontent.= '<input type="image" src="go.jpg" name="cmd" value="home:/'.$directory.'/'.$dirlisting.'"> '.$fn.':// <b>'.$directory.'/'.$dirlisting.$dn.'/</b><br>';
}
}
closedir($handle);
for ($i=0; $i<count($dirs); $i++){
$dircontent.= searchalldirectories($dirs[$i], $seachterm, ($maxrecursions-1), $maxopendir);
}
}
return $dircontent;
}