使用 PHP 从 FTP 获取目录结构
Get directory structure from FTP using PHP
我有 ftp 服务器,里面有很多子文件夹和文件。我需要从 ftp 检索文件夹结构,它显示指定起始路径中所有文件夹和子文件夹的名称。我对每个文件夹中包含的文件不感兴趣,只对目录树感兴趣。我正在使用 PHP,但我的服务器不支持 mlsd。
感谢您的帮助。
我实现了自己的递归函数,但由于某种原因无法正常工作。
function ftp_list_files_recursive($ftp_stream, $path) {
$lines = ftp_rawlist($ftp_stream, $path);
$result = [];
if (is_array($lines) || is_object($lines)) {
foreach ($lines as $line) {
$exp0 = explode('<', $line);
if (sizeof($exp0) > 1):
$exp1 = explode('>', $exp0[1]);
if ($exp1[0] == 'DIR') {
$file_path=$path . "/" . ltrim($exp1[1]);
$result = array_merge($result, ftp_list_files_recursive($ftp_stream, $file_path));
} else {
$result[] = $file_path;
}
endif;
}
}
return $result;
}
ftp_rawlist
returns 目录信息为: 01-18-20 01:00PM <DIR> DirName
所以我首先在 <
上爆炸并检查它是否成功。如果是,则表示字符串中包含 DIR
,并且可以在 >
上进一步展开。它可以用正则表达式来完成,但现在对我有用。如果我打印 $file_path
变量,我会看到它发生了变化,所以我假设递归有效。但是,$result
数组始终为空。有什么想法吗?
从这里开始:.
您只需要将代码调整为:
- 您从 FTP 服务器(可能是 IIS)获得的 DOS-style 列表和
- 仅收集文件夹。
function ftp_list_dirs_recursive($ftp_stream, $directory)
{
$result = [];
$lines = ftp_rawlist($ftp_stream, $directory);
if ($lines === false)
{
die("Cannot list $directory");
}
foreach ($lines as $line)
{
// rather lame parsing as a quick example:
if (strpos($line, "<DIR>") !== false)
{
$dir_path = $directory . "/" . ltrim(substr($line, strpos($line, ">") + 1));
$subdirs = ftp_list_dirs_recursive($ftp_stream, $dir_path);
$result = array_merge($result, [$dir_path], $subdirs);
}
}
return $result;
}
我有 ftp 服务器,里面有很多子文件夹和文件。我需要从 ftp 检索文件夹结构,它显示指定起始路径中所有文件夹和子文件夹的名称。我对每个文件夹中包含的文件不感兴趣,只对目录树感兴趣。我正在使用 PHP,但我的服务器不支持 mlsd。
感谢您的帮助。
我实现了自己的递归函数,但由于某种原因无法正常工作。
function ftp_list_files_recursive($ftp_stream, $path) {
$lines = ftp_rawlist($ftp_stream, $path);
$result = [];
if (is_array($lines) || is_object($lines)) {
foreach ($lines as $line) {
$exp0 = explode('<', $line);
if (sizeof($exp0) > 1):
$exp1 = explode('>', $exp0[1]);
if ($exp1[0] == 'DIR') {
$file_path=$path . "/" . ltrim($exp1[1]);
$result = array_merge($result, ftp_list_files_recursive($ftp_stream, $file_path));
} else {
$result[] = $file_path;
}
endif;
}
}
return $result;
}
ftp_rawlist
returns 目录信息为: 01-18-20 01:00PM <DIR> DirName
所以我首先在 <
上爆炸并检查它是否成功。如果是,则表示字符串中包含 DIR
,并且可以在 >
上进一步展开。它可以用正则表达式来完成,但现在对我有用。如果我打印 $file_path
变量,我会看到它发生了变化,所以我假设递归有效。但是,$result
数组始终为空。有什么想法吗?
从这里开始:
您只需要将代码调整为:
- 您从 FTP 服务器(可能是 IIS)获得的 DOS-style 列表和
- 仅收集文件夹。
function ftp_list_dirs_recursive($ftp_stream, $directory)
{
$result = [];
$lines = ftp_rawlist($ftp_stream, $directory);
if ($lines === false)
{
die("Cannot list $directory");
}
foreach ($lines as $line)
{
// rather lame parsing as a quick example:
if (strpos($line, "<DIR>") !== false)
{
$dir_path = $directory . "/" . ltrim(substr($line, strpos($line, ">") + 1));
$subdirs = ftp_list_dirs_recursive($ftp_stream, $dir_path);
$result = array_merge($result, [$dir_path], $subdirs);
}
}
return $result;
}