2016-04-22 1 views
1

У меня есть код ниже, чтобы получить контент из удаленного каталога.Используйте 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... 
    } 
} 

ответ

0

Ваш цикл, пока пересекающий весь каталог до тех пор, пока не останется больше файлов, в этом случае READDIR возвращает ложь. Поэтому любое время readdir вызывается после первого обхода, оно просто возвращает false, потому что оно уже находится в конце каталога.

Вы можете использовать rewinddir() в цикле for, чтобы сбросить указатель дескриптора каталога до начала.

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

Поскольку поток SFTP, как представляется, не поддерживает поиск, вы должны просто хранить необходимые результаты и сделать цикл после цикла. Вы, в конце концов, пересекаете один и тот же каталог несколько раз.

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

Это дает мне потепление. Сообщение: readdir() ожидает, что параметр 1 является ресурсом, null задан –

+0

Отладка $ dirHandle, либо opendir терпит неудачу, либо он установлен на нуль на этом пути. Обновите свой пост с помощью своего фактического кода, чтобы мы могли видеть. – Devon

+0

Я использовал '$ dirHandle = rewinddir ($ dirHandle);'. Теперь я использовал просто 'rewinddir ($ dirHandle);' и сообщение: 'rewinddir(): stream не поддерживает поиск' –

Смежные вопросы