shotdsherrif
shotdsherrif

Reputation: 563

Filepaths and Recursion in PHP

I'm trying to recursively iterate through a group of dirs that contain either files to upload or another dir to check for files to upload.

So far, I'm getting my script to go 2 levels deep into the filesystem, but I haven't figured out a way to keep my current full filepath in scope for my function:

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;

}

So, everytime I call getPathsinFolder I have the basepath I started with plus the current name of the directory I'm scandirring. But I'm missing the intermediate folders in between. How to keep the full current filepath in scope?

Upvotes: 0

Views: 59

Answers (2)

shotdsherrif
shotdsherrif

Reputation: 563

Thank you. Yes, I needed to build the full path inside the function. Here is the version that works:

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;

}

Upvotes: 0

spamsink
spamsink

Reputation: 324

Very simple. If you want recursion, you need to pass the whole path as a parameter when you call your getPathsinFolder().

Scanning a large directory tree might be more efficient using a stack to save the intermediate paths (which would normally go on the heap), rather than use much more of the system stack (it has to save the path as well as a whole frame for the next level of the function call.

Upvotes: 1

Related Questions