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

时间:2016-04-22 15:50:53

标签: php file ssh directory opendir

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

$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中的第二条记录。

我怎样才能这样做,我只需要使用$dirHandle = opendir("ssh2.sftp://$sftp/".PATH_OUT); for(...){ while (false !== ($file = readdir($dirHandle))) { // something... } } 一次并使用该连接超过1次?

必备解决方案

string filename = Path.GetFileName(file.FileName);
                file.SaveAs(Server.MapPath("UploadImages/" + filename));
                string attachmentPath = Server.MapPath("UploadImages/" + filename);
                Attachment inline = new Attachment(attachmentPath);
                inline.ContentDisposition.Inline = true;
                inline.ContentDisposition.DispositionType = DispositionTypeNames.Inline;
                inline.ContentType.Name = Path.GetFileName(attachmentPath);
                mail.Attachments.Add(inline);

1 个答案:

答案 0 :(得分:0)

你的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
}