使用 opendir 一次,而不是在 for 循环中使用它


Use opendir one time instead of using it in for loop

我有以下代码可以从远程目录获取内容。

$dirHandle = opendir("ssh2.sftp://$sftp/".PATH_OUT);
while (false !== ($file = readdir($dirHandle))) {
  // something...
}

现在,问题是,上面的代码是forloop的。 当我$dirHandle = opendir("ssh2.sftp://$sftp/".PNB_PATH_OUT);放在forloop之外时,它只为第一条记录提供了所需的结果。所以,显然readdir不适用于forloop的第二张唱片。

怎样才能做到这一点,这样我只需要使用一次opendir并且使用该连接超过 1 次?

所需的解决方案

$dirHandle = opendir("ssh2.sftp://$sftp/".PATH_OUT);
for(...){
    while (false !== ($file = readdir($dirHandle))) {
      // something...
    }
}

你的 while 循环遍历整个目录,直到没有更多的文件,在这种情况下,readdir 返回 false。 因此,每当在第一次遍历后调用 readdir 时,它都会返回 false,因为它已经在目录的末尾。

您可以在 for 循环中使用 rewinddir() 将目录句柄的指针重置为开头。

$dirHandle = opendir("ssh2.sftp://$sftp/".PATH_OUT);
for(...){
    rewinddir($dirHandle);
    while (false !== ($file = readdir($dirHandle))) {
      // something...
    }
}

由于 sftp 流似乎不支持查找,因此您应该只存储所需的结果并在 while 循环之后执行 for 循环。 毕竟,您正在多次遍历同一目录。

$dirHandle = opendir("ssh2.sftp://$sftp/".PATH_OUT);
while (false !== ($file = readdir($dirHandle))) {
  $files[] = $file;
}
for(...){
    // use $files array
}