使用一次 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 returns false。因此,在第一次遍历后调用 readdir 时,它只会 return 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
}