枚举父目录中的文件

时间:2011-07-13 23:12:29

标签: php filesystems

我有以下函数枚举给定文件夹中的文件和目录。它适用于执行子文件夹,但由于某种原因,它不希望在父目录上工作。有什么想法吗?我想它可能是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);
}

1 个答案:

答案 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将抛出错误。你应该以某种方式检查它。