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
Решение просто и понятно. Но что значит 2 в этом случае? После closedir $dh содержит в себе какое-то INT число?
Ну, я же и об это сказал: число обозначает номер итерации (шаг) цикла. В данном случае, ошибка появляется на втором шаге, т.к. я в сам цикл вставил закрытие потока функцией closedir().