PHP中的文件路径和递归

时间:2013-05-03 01:20:27

标签: php recursion filesystems

我试图递归遍历一组目录,其中包含要上传的文件或其他目录以检查要上传的文件。

到目前为止,我已经让我的脚本深入到文件系统的两个级别,但我还没有想出办法让我当前的完整文件路径保留在我的函数范围内:

function getPathsinFolder($basepath = null) {

    $fullpath = 'www/doc_upload/test_batch_01/';

    if(isset($basepath)):
        $files = scandir($fullpath . $basepath . '/');
    else:
        $files = scandir($fullpath);
    endif;

    $one = array_shift($files); // to remove . & .. 
    $two = array_shift($files);

    foreach($files as $file):
        $type = filetype($fullpath . $file);
        print $file . ' is a ' . $type . '<br/>';

        if($type == 'dir'):

            getPathsinFolder($file);

        elseif(($type == 'file')):

            //uploadDocsinFolder($file);

        endif;

    endforeach;

}

因此,每当我调用getPathsinFolder时,我都会使用我开始使用的基本路径以及目录中的当前名称“scandirring”。但是我错过了中间文件夹。如何将完整的当前文件路径保留在范围内?

2 个答案:

答案 0 :(得分:1)

很简单。如果你想要递归,你需要在调用getPathsinFolder()时将整个路径作为参数传递。

使用堆栈来保存中间路径(通常会在堆上),扫描大型目录树可能更有效,而不是使用更多的系统堆栈(它必须保存路径以及整个帧用于函数调用的下一级。

答案 1 :(得分:0)

谢谢。是的,我需要在函数内部构建完整路径。这是适用的版本:

function getPathsinFolder($path = null) {

    if(isset($path)):
        $files = scandir($path);
    else: // Default path
        $path = 'www/doc_upload/';
        $files = scandir($path);
    endif;

    // Remove . & .. dirs
    $remove_onedot = array_shift($files);
    $remove_twodot = array_shift($files);
    var_dump($files);

    foreach($files as $file):
        $type = filetype($path . '/' . $file);
        print $file . ' is a ' . $type . '<br/>';
        $fullpath = $path . $file . '/';
        var_dump($fullpath);

        if($type == 'dir'):
            getPathsinFolder($fullpath);
        elseif(($type == 'file')):
            //uploadDocsinFolder($file);
        endif;

    endforeach;

}