scandir() - файлы не определяются, как файлы

  • Автор темы Автор темы rasebor
  • Дата начала Дата начала

rasebor

Новичок
scandir() - файлы не определяются, как файлы

Функция scandir() не определяет файлы, как файлы - в любом каталоге, кроме текущего. То есть такой код работает корректно:
PHP:
$dirdata = scandir(".");
foreach ($dirdata as $key => $element) {
	if (is_file($element)) {
		echo $element . " (file)<br>";
	}
	elseif (is_dir($element)) {
		echo $element . " (dir)<br>";
	}
	else {
		echo $element . " (undefined)<br>";
	}
}
Но если задать дочерний каталог,

Хоть так:
PHP:
$dirdata = scandir("next_dir");
Хоть так:
PHP:
$def_dir = realpath("next_dir");
$dirdata = scandir($def_dir);

то файлы выводятся не как (file), а как (undefined), хотя в текущем "." каталоге определяются как положено.
И я ни фига не понимаю, в чем дело :(

Просветите, пожалуйста, пока моск не сломался..

-~{}~ 26.01.09 16:08:

Тестил как на своем компьютере, на Windows - так и на Мастерхост, на Линукс.
 
Ты ж учти что такая проверка проверяет сразу в текущей директории
Конечно undefined
if (is_file($element)) {
echo $element . " (file)<br>";
}
 
2Glazyrin Sergey, зачем - если реальный путь уже задан?
PHP:
$def_dir = realpath("next_dir");
$dirdata = scandir($def_dir);

Кстати, все равно не помогает.

-~{}~ 26.01.09 16:37:

Кто-нибудь, объясните пожалуйста суть ошибки.
 
Ну тогда я не знаю.
Думай сам. Но причина в этом - сядь выпей чайку и побачиш

-~{}~ 26.01.09 16:38:

Подумай откуда файлы читаются ? В какой директории ищутся ? Как ответишь на эти вопросы поймешь
 
Непонятка в том, что файлы читаются, только так вот странно:
PHP:
. (dir)
.. (dir)
descript (undefined)
descript.html (undefined)
img (undefined)
index.html (undefined)

А читаются они из дочерней папки. И если скрипт расположить там, и прописать, соответственно, директорию как "." - то и определяются файлы, как файлы.

-~{}~ 26.01.09 16:52:

А почему в дочерней криво? Непонятно..
 
Ну что получилось ?
Смотри у тебя путь "считывается" из текущей директории
Когда ты делаешь scandir по текущей директории , то все гуд
Меняешь отправную точку scandir - все не гуд, потому что файлы у тебя в массиве не содержат абсолютный путь, там содержатся только имена с расширением
Соответственно тебе надо подставлять в is_file часть пути откуда ему смотреть.
А вот как это сделать уже догадайся сам. Неужели не кайф самому понять что то ? И получить левел ап ?
 
Автор оригинала: Glazyrin Sergey
Ну что получилось ?
Смотри у тебя путь "считывается" из текущей директории
Когда ты делаешь scandir по текущей директории , то все гуд
Меняешь отправную точку scandir - все не гуд, потому что файлы у тебя в массиве не содержат абсолютный путь, там содержатся только имена с расширением
Соответственно тебе надо подставлять в is_file часть пути откуда ему смотреть.
А вот как это сделать уже догадайся сам. Неужели не кайф самому понять что то ? И получить левел ап ?
Поступил по другому: сменил текущий каталог ф-ей chdir(). Получился вполне рабочий код:
PHP:
$real_path = realpath("next_dir"); // Реальный путь к дочернему каталогу
$def_dir = chdir($real_path); // Смена текущего каталога
echo "Новый текущий каталог: " . getcwd() . "<br>\n"; // Проверка, что текущий каталог изменился
$dirdata = scandir("."); // Обход текущего каталога - то есть уже "next_dir"
foreach ($dirdata as $key => $element) {
	if (is_file($element)) {
		echo $element . " (file)<br>\n";
	}
	elseif (is_dir($element)) {
		echo $element . " (dir)<br>\n";
	}
	else {
		echo $element . " (undefined)<br>\n";
	}
}

А вот с путями в is_file у меня так ничего и не вышло. Видно, моск заклинило. Если не трудно - напишите строчку правильного кода, пожалуйста.
 
у тебя какие значения в is_file, is_dir передаются? где по-твоему эти функции должны искать файлы и почему?
 
PHP:
$path = 'next_dir';
$data = scandir($path);
foreach($data as $el) {
	$elPath =  $path.'/'.$el; 
	if (is_file($elPath)) {
        echo $el . " (file)<br>\n";
    }
    elseif (is_dir($elPath)) {
        echo $el . " (dir)<br>\n";
    }
    else {
        echo $el . " (undefined)<br>\n";
    } 
}
 
john.brown
лишил человека возможности подумать.
теперь он за каждым чихом сюда будет приходить.
 
zerkms
Ну извиняй. Человек уже два дня думает, аж до chdir додумался 8) Жалко стало :)
 
john.brown
он бы сделал через задницу (намекаю на chdir()). потом напоролся бы на грабли с этим же чдиром. и потом бы прозрел или пошёл бы устраиваться в евросеть ;-)
 
zerkms, за каждым чихом не прихожу. Посмотри мои ранние посты. И спасибо за совет c getcwd() - благодаря ему я увидел, что скрип видит лишь текущую директорию. Но меня сбивало с толку, что файлы в next_dir все-таки отображаются.
Glazyrin Sergey, спасибо, что разжевал все)) В принципе, я уже пришел (почти) к тому варианту, что написал john.brown
john.brown, отдельное спасибо! У меня и правда что-то в мозгу заклинило) Три дня вокруг и около ходил. Даже этот грешный слэш где-то ставил. Правда - не там, где нужно))

Ребята, спасибо огромное всем, кто откликнулся! Все работает и с относительным путем, и с абсолютным.

-~{}~ 28.01.09 00:07:

zerkms, а в чем засада с chdir()? Я и сам ее нюхом чую, только осознать толком не могу.

-~{}~ 28.01.09 00:17:

Я так понимаю, что смена каталога распространится на последующий код?
 
Я так понимаю, что смена каталога распространится на последующий код?
конечно... все последующие файловые операции будут производиться относительно выбранной директории, а не текущей, как ожидается.
 
Сверху