通过SFTP的远程服务器中文件和文件夹的完整列表

时间:2018-08-08 15:50:33

标签: php sftp

如何通过PHP中的SFTP递归列出远程服务器中的所有文件?

opendirscandir仅列出当前文件夹。

1 个答案:

答案 0 :(得分:2)

phpseclib library具有内置的递归列表,只需将Net_SFTP.nlist()$recursive = true一起使用:

set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
require_once("Net/SFTP.php");

$sftp = new Net_SFTP($hostname);

if (!$sftp->login($username, $password))
{
    die("Cannot login to the server");
}

if (!($files = $sftp->nlist($path, true)))
{
    die("Cannot read directory contents");
}

foreach ($files as $file)
{
    echo "$file\n";
}

如果您甚至需要列出文件夹名称(以便捕获空文件夹),则必须重新实现nlist的作用:

function nlist_with_folders($sftp, $dir)
{
    $files = $sftp->rawlist($dir);
    if ($files === false)
    {
        $result = false;
    }
    else
    {
        $result = array();
        foreach ($files as $name => $attrs)
        {
            if (($name != ".") && ($name != ".."))
            {
                $path = "$dir/$name";
                $result[] = $path;
                if ($attrs["type"] == NET_SFTP_TYPE_DIRECTORY)
                {
                    $sub_files = nlist_with_folders($sftp, $path);
                    $result = array_merge($result, $sub_files);
                }
            }
        }
    }

    return $result;
}

phpseclib不需要任何安装,也没有任何强制性的依赖关系。这是一个“纯PHP” 代码。您只需下载包含PHP代码的归档文件,然后将其解压缩到Web服务器(或者,如果您没有Shell访问Web服务器的权限,则将其本地提取并上传提取的代码)。在我的示例中,我将其提取到phpseclib子文件夹中。

相关问题