gpt4 book ai didi

PHP FTP 递归目录列表

转载 作者:行者123 更新时间:2023-12-03 22:44:31 25 4
gpt4 key购买 nike

我正在尝试使用递归函数从我的 ftp 服务器中获取所有目录和子目录的数组。

我尝试了很多我在网上找到的功能。最适合我的是这个:

public function getAllSubDirFiles() {
$dir = array(".");
$a = count($dir);
$i = 0;
$depth = 20;
$b = 0;
while (($a != $b) && ($i < $depth)) {
$i++;
$a = count($dir);
foreach ($dir as $d) {
$ftp_dir = $d . "/";
$newdir = ftp_nlist($this->connectionId, $ftp_dir);
foreach ($newdir as $key => $x) {

if ((strpos($x, ".")) || (strpos($x, ".") === 0)) {
unset($newdir[$key]);
} elseif (!in_array($x, $dir)) {
$dir[] = $x;
}
}
}
$b = count($dir);
}
return $dir ;

}

这个函数的问题是它不允许目录有一个“.”。在它的名称中,位于根目录中的每个文件也将被视为一个目录。所以我调整了函数并得到了这个:
public function getAllSubDirFiles($ip, $id, $pw) {
$dir = array(".");
$a = count($dir);
$i = 0;
$depth = 20;
$b =0;
while (($a != $b) && ($i < $depth)) {
$i++;
$a = count($dir);
foreach ($dir as $d) {
$ftp_dir = $d . "/";
$newdir = ftp_nlist($this->connectionId, $ftp_dir);
foreach ($newdir as $key => $x) {
if (!is_dir('ftp://'.$id.':'.$pw.'@'.$ip.'/'.$x)) {
unset($newdir[$key]);
} elseif (!in_array($x, $dir)) {
$dir[] = $x;
}
}
}
$b = count($dir);
}
return $dir ;

}

这很有效,但给出了我想要的结果。但它太慢了,无法使用。

我也尝试使用 ftp_rawlist但它也有同样的缺点,那就是太慢了。
public function getAllSubDirFiles() {
$dir = array(".");
$a = count($dir);
$i = 0;
$depth = 20;
$b = 0;
while (($a != $b) && ($i < $depth)) {
$i++;
$a = count($dir);
foreach ($dir as $d) {
$ftp_dir = $d . "/";
$newdir = $this->getFtp_rawlist('/' . $ftp_dir);
foreach ($newdir as $key => $x) {

$firstChar = substr($newdir[$key][0], 0, 1);

$a = 8;
while ($a < count($newdir[$key])) {

if ($a == 8) {
$fileName = $ftp_dir . '/' . $newdir[$key][$a];
} else {
$fileName = $fileName . ' ' . $newdir[$key][$a];
}
$a++;
}

if ($firstChar != 'd') {
unset($newdir[$key]);
} elseif (!in_array($fileName, $dir)) {

$dir[] = $fileName;
}
}
}
$b = count($dir);
}
return $dir;
}

public function getFtp_rawlist($dir) {

$newArr = array();

$arr = ftp_rawlist($this->connectionId, $dir);

foreach ($arr as $value) {

$stringArr = explode(" ", $value);

$newArr[] = array_values(array_filter($stringArr));
}
return $newArr;
}

过去几天我一直被这个问题困扰,我越来越绝望。如果有人有任何建议,请告诉我

最佳答案

如果您的服务器支持 MLSD命令并且你有 PHP 7.2 或更新版本,你可以使用 ftp_mlsd function :

function ftp_mlsd_recursive($ftp_stream, $directory)
{
$result = [];

$files = ftp_mlsd($ftp_stream, $directory);
if ($files === false)
{
die("Cannot list $directory");
}

foreach ($files as $file)
{
$name = $file["name"];
$filepath = $directory . "/" . $name;
if (($file["type"] == "cdir") || ($file["type"] == "pdir"))
{
// noop
}
else if ($file["type"] == "dir")
{
$result = array_merge($result, ftp_mlsd_recursive($ftp_stream, $filepath));
}
else
{
$result[] = $filepath;
}
}
return $result;
}
如果你没有 PHP 7.2,你可以尝试实现 MLSD自己指挥。首先,请参阅 ftp_rawlist 的用户评论。命令:
https://www.php.net/manual/en/function.ftp-rawlist.php#101071

如果您不能使用 MLSD ,您将特别难以判断 entry is a file or folder .虽然您可以使用 ftp_size把戏,打电话 ftp_size 对于每个条目可能需要很长时间。
但是如果您只需要针对一个特定的 FTP 服务器工作,您可以使用 ftp_rawlist 以特定于平台的格式检索文件列表并对其进行解析。
以下代码假定使用常见的 *nix 格式。
function ftp_nlst_recursive($ftp_stream, $directory)
{
$result = [];

$lines = ftp_rawlist($ftp_stream, $directory);
if ($lines === false)
{
die("Cannot list $directory");
}

foreach ($lines as $line)
{
$tokens = preg_split("/\s+/", $line, 9);
$name = $tokens[8];
$type = $tokens[0][0];
$filepath = $directory . "/" . $name;

if ($type == 'd')
{
$result = array_merge($result, ftp_nlst_recursive($ftp_stream, $filepath));
}
else
{
$result[] = $filepath;
}
}
return $result;
}
对于 DOS 格式,请参阅: Get directory structure from FTP using PHP .

关于PHP FTP 递归目录列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36310247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com