private function fetchKeys($directory = '', $onlyKeys = true)
{
$directory = preg_replace('/^[\\/]*([^\\/].*)$/', '/$1', $directory);
$lines = ftp_rawlist($this->getConnection(), '-alR ' . $this->directory . $directory);
if (false === $lines) {
return array('keys' => array(), 'dirs' => array());
}
$regexDir = '/' . preg_quote($this->directory . $directory, '/') . '\\/?(.+):$/u';
$regexItem = '/^(?:([d\\-\\d])\\S+)\\s+\\S+(?:(?:\\s+\\S+){5})?\\s+(\\S+)\\s+(.+?)$/';
$prevLine = null;
$directories = array();
$keys = array('keys' => array(), 'dirs' => array());
foreach ((array) $lines as $line) {
if ('' === $prevLine && preg_match($regexDir, $line, $match)) {
$directory = $match[1];
unset($directories[$directory]);
if ($onlyKeys) {
$keys = array('keys' => array_merge($keys['keys'], $keys['dirs']), 'dirs' => array());
}
} elseif (preg_match($regexItem, $line, $tokens)) {
$name = $tokens[3];
if ('.' === $name || '..' === $name) {
continue;
}
$path = ltrim($directory . '/' . $name, '/');
if ('d' === $tokens[1] || '<dir>' === $tokens[2]) {
$keys['dirs'][] = $path;
$directories[$path] = true;
} else {
$keys['keys'][] = $path;
}
}
$prevLine = $line;
}
if ($onlyKeys) {
$keys = array('keys' => array_merge($keys['keys'], $keys['dirs']), 'dirs' => array());
}
foreach (array_keys($directories) as $directory) {
$keys = array_merge_recursive($keys, $this->fetchKeys($directory, $onlyKeys));
}
return $keys;
}