function dir_tree($dir, $durl = '', $include = '', $exclude = '', $dirinclude = '', $direxclude = '')
 {
     static $seen = array();
     $files = array();
     $dir = realpath($dir);
     if (isset($seen[$dir])) {
         return $files;
     }
     $seen[$dir] = TRUE;
     $dh = @opendir($dir);
     while ($dh && ($file = readdir($dh))) {
         if ($file !== '.' && $file !== '..') {
             $path = realpath($dir . '/' . $file);
             $url = $durl . '/' . $file;
             if ($dirinclude && !preg_match($dirinclude, $url) || $direxclude && preg_match($direxclude, $url)) {
                 continue;
             }
             if (is_dir($path)) {
                 if ($subdir = RheinaufFile::dir_tree($path, $url)) {
                     $files[] = array('url' => $url, 'children' => $subdir);
                 }
             } elseif (is_file($path)) {
                 if ($include && !preg_match($include, $url) || $exclude && preg_match($exclude, $url)) {
                     continue;
                 }
                 $files[] = array('url' => $url);
             }
         }
     }
     @closedir($dh);
     return RheinaufFile::dirsort($files);
 }