我有以下函数枚举给定文件夹中的文件和目录。它适用于执行子文件夹,但由于某种原因,它不希望在父目录上工作。有什么想法吗?我想它可能是PHP的设置或其他东西,但我不知道从哪里开始。如果是的话,我运气不好,因为这将是在廉价的共享主机设置上运行。
以下是您使用该功能的方法。第一个参数是枚举路径,第二个参数是要忽略的过滤器列表。我已经尝试传递下面列出的完整路径。我尝试过..
,./..
和realpath('..')
。似乎没什么用。我知道这个功能并没有以某种方式无声地失败。如果我手动将目录添加到dirs数组,我会返回一个值。
$projFolder = '/hsphere/local/home/customerid/sitename/foldertoindex';
$items = enumerateDirs($projFolder, array(0 => "Admin", 1 => "inc"));
这是函数本身
function enumerateDirs($directory, $filterList)
{
$handle = opendir($directory);
while (false !== ($item = readdir($handle)))
{
if ($item != "." && $item != ".." && $item != "inc" && array_search($item, $filterList) === false)
{
$path = "{$directory->path}/{$item}";
if (is_dir($item))
{
$tmp['name'] = $item;
$dirs[$item] = $tmp;
unset($tmp);
}
elseif (is_file($item))
{
$tmp['name'] = $item;
$files[] = $tmp;
unset($tmp);
}
}
}
ksort($dirs, SORT_STRING);
sort($dirs);
ksort($files, SORT_STRING);
sort($files);
return array("dirs" => $dirs, "files" => $files);
}
答案 0 :(得分:1)
你正在混合opendir和dir。您还需要将完整路径(包括目录组件)传递给is_dir和is_file。 (我假设你的意思是使用$ path。)否则,函数将在脚本文件的目录中查找相应的文件系统对象。
试试这个以便快速解决问题:
<?php
function enumerateDirs($directory, $filterList)
{
$handle = dir($directory);
while (false !== ($item = $handle->read()))
{
if ($item != "." && $item != ".." && $item != "inc" && array_search($item, $filterList) === false)
{
$path = "{$handle->path}/{$item}";
$tmp['name'] = $item;
if (is_dir($path))
{
$dirs[] = $tmp;
}
elseif (is_file($path))
{
$files[] = $tmp;
}
unset($tmp);
}
}
$handle->close();
/* Anonymous functions will need PHP 5.3+. If your version is older, take a
* look at create_function
*/
$sortFunc = function ($a, $b) { return strcmp($a['name'], $b['name']); };
usort($dirs, $sortFunc);
usort($files, $sortFunc);
return array("dirs" => $dirs, "files" => $files);
}
$ret = enumerateDirs('../', array());
var_dump($ret);
注意:while循环后可能未设置$ files或$ dirs。 (可能没有文件或目录。)在这种情况下,usort将抛出错误。你应该以某种方式检查它。