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

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 - так и на Мастерхост, на Линукс.
 

Glazyrin Sergey

Новичок
Ты ж учти что такая проверка проверяет сразу в текущей директории
Конечно undefined
if (is_file($element)) {
echo $element . " (file)<br>";
}
 

rasebor

Новичок
2Glazyrin Sergey, зачем - если реальный путь уже задан?
PHP:
$def_dir = realpath("next_dir");
$dirdata = scandir($def_dir);
Кстати, все равно не помогает.

-~{}~ 26.01.09 16:37:

Кто-нибудь, объясните пожалуйста суть ошибки.
 

Glazyrin Sergey

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

-~{}~ 26.01.09 16:38:

Подумай откуда файлы читаются ? В какой директории ищутся ? Как ответишь на эти вопросы поймешь
 

rasebor

Новичок
Непонятка в том, что файлы читаются, только так вот странно:
PHP:
. (dir)
.. (dir)
descript (undefined)
descript.html (undefined)
img (undefined)
index.html (undefined)
А читаются они из дочерней папки. И если скрипт расположить там, и прописать, соответственно, директорию как "." - то и определяются файлы, как файлы.

-~{}~ 26.01.09 16:52:

А почему в дочерней криво? Непонятно..
 

Glazyrin Sergey

Новичок
Ну что получилось ?
Смотри у тебя путь "считывается" из текущей директории
Когда ты делаешь scandir по текущей директории , то все гуд
Меняешь отправную точку scandir - все не гуд, потому что файлы у тебя в массиве не содержат абсолютный путь, там содержатся только имена с расширением
Соответственно тебе надо подставлять в is_file часть пути откуда ему смотреть.
А вот как это сделать уже догадайся сам. Неужели не кайф самому понять что то ? И получить левел ап ?
 

rasebor

Новичок
Автор оригинала: 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 у меня так ничего и не вышло. Видно, моск заклинило. Если не трудно - напишите строчку правильного кода, пожалуйста.
 

x-yuri

Новичок
у тебя какие значения в is_file, is_dir передаются? где по-твоему эти функции должны искать файлы и почему?
 

john.brown

просто кулибин
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";
    } 
}
 

zerkms

TDD infected
Команда форума
john.brown
лишил человека возможности подумать.
теперь он за каждым чихом сюда будет приходить.
 

john.brown

просто кулибин
zerkms
Ну извиняй. Человек уже два дня думает, аж до chdir додумался 8) Жалко стало :)
 

zerkms

TDD infected
Команда форума
john.brown
он бы сделал через задницу (намекаю на chdir()). потом напоролся бы на грабли с этим же чдиром. и потом бы прозрел или пошёл бы устраиваться в евросеть ;-)
 

rasebor

Новичок
zerkms, за каждым чихом не прихожу. Посмотри мои ранние посты. И спасибо за совет c getcwd() - благодаря ему я увидел, что скрип видит лишь текущую директорию. Но меня сбивало с толку, что файлы в next_dir все-таки отображаются.
Glazyrin Sergey, спасибо, что разжевал все)) В принципе, я уже пришел (почти) к тому варианту, что написал john.brown
john.brown, отдельное спасибо! У меня и правда что-то в мозгу заклинило) Три дня вокруг и около ходил. Даже этот грешный слэш где-то ставил. Правда - не там, где нужно))

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

-~{}~ 28.01.09 00:07:

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

-~{}~ 28.01.09 00:17:

Я так понимаю, что смена каталога распространится на последующий код?
 

zerkms

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