PHP ошибка readdir(): 2 is not a valid Directory resource

Если ваша программа не работает, значит, в ней есть ошибка. Проблема лишь в том, что собой представляет ошибка и где она находится. Сегодня я столкнулся с тем, что php-функция readdir() выдавала ошибку: 2 is not a valid Directory resource – и я никак не мог понять, в чём проблема. Надеюсь, моя заметка поможет вам сберечь время и силы.

Начнём с того, что в качестве параметра функции readdir() выступает дескриптор каталога (ресурс), который возвращает функция opendir(). Примечательно, что если дескриптор каталога не указан, используется последний дескриптор, открытый функцией opendir(). Но это так, к слову. Нам же важно соблюдать последовательность действий, например:

$dir = '.';
$dh = opendir($dir);
if ( $dh === false ) die($dir .' - ERROR');
while ( ( $file = readdir($dh) ) !== false ) {
  echo $file;
}
closedir($dh);

В данном случае переменная $dh содержит дескриптор каталога $dir. В том случае, если readdir() передать путь к открываемому каталогу $dir может возникнуть упомянутая ранее ошибка. Впрочем, такого рода ошибка свойственна скорее новичкам, а у меня было другое.

В моём случае, я сделал преждевременное закрытие потока, поместив функцию closedir() в цикл while, например:

$dh = opendir($dir);
if ( $dh === false ) die($dir .' - ERROR');
while ( ( $file = readdir($dh) ) !== false ) {
  echo $file;
  closedir($dh);
}

Таким образом, первый шаг цикла прошел успешно, а вот потом функция readdir(), вместо дескриптора каталога получила пустое значение, что и привело к ошибке. К слову, шаг цикла, приведший к ошибке, отображается в сообщении о таковой.

Если вы сталкивались с ошибкой: readdir(): N is not a valid Directory resource – в других вариантах, буду благодарен за уточнения и примеры. На этом у меня всё. Спасибо за внимание. Удачи!

Короткая ссылка: http://goo.gl/oV2lD2

alexander.plutov
alexander.plutov комментирует...

Решение просто и понятно. Но что значит 2 в этом случае? После closedir $dh содержит в себе какое-то INT число?

Константин Кирилюк
Константин Кирилюк комментирует...

Ну, я же и об это сказал: число обозначает номер итерации (шаг) цикла. В данном случае, ошибка появляется на втором шаге, т.к. я в сам цикл вставил закрытие потока функцией closedir().