[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Работа с readdir() и is_dir()
RCuPeR
Добрый вечер всем.
Ситуация следующая:
Пишу скрипт обрезки картинок по заданным параметрам. Функция обрезки готова и работает на "ура". Но проблема в следующем: получение файлов изображений из файловой системы.

Проблема в том, что не могу прочитать подпапки из директории.


function crop_files($path){

if (!$handle = opendir($path)) {
echo "<p>renamefiles() execution error: Can not open directory $path</p>";
}

$list = array();

while (($file = readdir($handle)) !== false) {
// Skip reserved words
if (($file == '.') || ($file == '..')) continue;
$list[] = $file;
}

//foreach($list as $key => $value){
// @crop('./0/'. $value .'', './0/result/'. $key .'.png', array(20, 20, -25, -25));
//}


echo '<pre>'; print_r($list); echo '</pre>';

}


Возвращает массив:


Array
(
[0] => 10.png
[1] => 11.png
[2] => 12.png
[3] => 13.png
[4] => 14.png
[5] => 15.png
[6] => 16.png
[7] => 17.png
[8] => 18.png
[9] => 19.png
[10] => 20.png
[11] => result
[12] => Thumbs.db
)


Нужно как-то узнать, что $list[11] = 'result', это папка, и прочитать её заново.
Как это сделать - ума не приложу.

Весь скрипт:
<?php

function
crop($file_input, $file_output, $crop = 'square',$percent = false) {
list($w_i, $h_i, $type) = getimagesize($file_input);
if (!$w_i || !$h_i) {
echo 'Невозможно получить длину и ширину изображения';
return;
}
$types = array('','gif','jpeg','png');
$ext = $types[$type];
if ($ext) {
$func = 'imagecreatefrom'.$ext;
$img = $func($file_input);
} else {
echo 'Некорректный формат файла';
return;
}
if ($crop == 'square') {
$min = $w_i;
if ($w_i > $h_i) $min = $h_i;
$w_o = $h_o = $min;
} else {
list($x_o, $y_o, $w_o, $h_o) = $crop;
if ($percent) {
$w_o *= $w_i / 100;
$h_o *= $h_i / 100;
$x_o *= $w_i / 100;
$y_o *= $h_i / 100;
}
if ($w_o < 0) $w_o += $w_i;
$w_o -= $x_o;
if ($h_o < 0) $h_o += $h_i;
$h_o -= $y_o;
}
$img_o = imagecreatetruecolor($w_o, $h_o);
imagecopy($img_o, $img, 0, 0, $x_o, $y_o, $w_o, $h_o);
if ($type == 2) {
imagejpeg($img_o,$file_output,100);
imagedestroy($img_o);
} else {
$func = 'image'.$ext;
return $func($img_o,$file_output);
}
}



function crop_files($path){

if (!$handle = opendir($path)) {
echo "<p>renamefiles() execution error: Can not open directory $path</p>";
}

$list = array();

while (($file = readdir($handle)) !== false) {
// Skip reserved words
if (($file == '.') || ($file == '..')) continue;
$list[] = $file;
}

//foreach($list as $key => $value){
// @crop('./0/'. $value .'', './0/result/'. $key .'.png', array(20, 20, -25, -25));
//}


echo '<pre>'; print_r($list); echo '</pre>';

}

crop_files('/xampp/htdocs/0/');




Спустя 5 минут, 6 секунд (6.09.2011 - 23:44) Игорь_Vasinsky написал(а):
функция is_file() - проверяеть файл ли это, если false - то директория

и тут самое время почитать про рекурсивные функции wink.gif

Спустя 9 минут, 10 секунд (6.09.2011 - 23:53) RCuPeR написал(а):
        if(is_file($list[4]))
echo 'Is file!';
else
echo 'Error!';


Возвращает "Error!".

Тот же ситуацьен с is_dir();.

Спустя 3 минуты, 35 секунд (6.09.2011 - 23:57) Игорь_Vasinsky написал(а):
упс...

ну тогда is_dir() wink.gif

Спустя 56 секунд (6.09.2011 - 23:58) Игорь_Vasinsky написал(а):
покажи var_dump - и результат is_file или is_dir

Спустя 30 секунд (6.09.2011 - 23:58) RCuPeR написал(а):
Цитата (RCuPeR @ 6.09.2011 - 20:53)
Тот же ситуацьен с is_dir();.

Вот!

Спустя 1 минута, 51 секунда (7.09.2011 - 00:00) RCuPeR написал(а):
Проблему решил.

        if(is_file($path.$list[11]))
echo 'Is file!';
else
echo 'Error!';


В переменной $path хранится полный путь к файлу.

Сейчас буду дальше разбирать...)

Спустя 4 минуты, 9 секунд (7.09.2011 - 00:04) Игорь_Vasinsky написал(а):
Цитата
полный путь к файлу


Цитата
bool is_dir ( string filename )


Возвращает TRUE, если файл существует и является директорией. Если filename - это относительное имя файла, оно будет проверено относительно текущей рабочей директории.


is_dir() - всё равно на путь, а is_file() - походу нет

Спустя 15 минут, 12 секунд (7.09.2011 - 00:19) RCuPeR написал(а):
В любом случае, $list[11] (который является папкой в файловой системе), ничего больше как элемент массива.

Array
(
[0] => 10.png
[1] => 11.png
[2] => 12.png
[3] => 13.png
[4] => 14.png
[5] => 15.png
[6] => 16.png
[7] => 17.png
[8] => 18.png
[9] => 19.png
[10] => 20.png
[11] => result
[12] => Thumbs.db
)


А вот с содействии с полным путем - это уже папка или файл.

Спустя 16 минут, 30 секунд (7.09.2011 - 00:36) Игорь_Vasinsky написал(а):
Цитата
ничего больше как элемент массива.


да, но is_dir - пройдёт по пути - найдёт этот елемент и проверит - папка ли это, а если путь не указан - то он будет его искать в "открытой директории".

Спустя 30 минут, 17 секунд (7.09.2011 - 01:06) RCuPeR написал(а):
Цитата (Игорь_Vasinsky @ 6.09.2011 - 21:36)
Цитата
ничего больше как элемент массива.

а если путь не указан - то он будет его искать в "открытой директории".

Ну, видимо не так.
В общем, не прокатило с is_dir(); || is_file();.

Вот, сделал красоту:

function crop_files($path){
$dirs[] = $path;
unset($path);
$list = array();
for($i=0;$i<count($dirs);$i++){
$path = $dirs[$i];
$handle = opendir($path);
while (($elem = readdir($handle)) !== false) {
if (($elem == '.') || ($elem == '..')) continue;
if (is_dir($path.$elem))
$dirs[] = $path.$elem.'/';
else
$list[$path][] = $elem;
}
closedir($handle);
}

echo '<pre>'; print_r($list); echo '</pre>';
}


Вернуло то, что нужно:

Array
(
[/xampp/htdocs/www.abpstickers.com.ua/0/] => Array
(
[0] => 10.png
[1] => 11.png
[2] => 12.png
[3] => 13.png
[4] => 14.png
[5] => 15.png
[6] => 16.png
[7] => 17.png
[8] => 18.png
[9] => 19.png
[10] => 20.png
[11] => Thumbs.db
)

[/xampp/htdocs/www.abpstickers.com.ua/1/] => Array
(
[0] => 10.png
[1] => 11.png
[2] => 12.png
[3] => 13.png
[4] => 14.png
[5] => 15.png
[6] => 16.png
[7] => 18.png
[8] => Thumbs.db
)

[/xampp/htdocs/www.abpstickers.com.ua/2/] => Array
(
[0] => 10.png
[1] => 11.png
[2] => 12.png
[3] => 13.png
[4] => 14.png
[5] => 15.png
[6] => 16.png
[7] => 17.png
[8] => 18.png
[9] => 19.png
[10] => Thumbs.db
)

[/xampp/htdocs/www.abpstickers.com.ua/3/] => Array
(
[0] => 10.png
[1] => 12.png
[2] => 14.png
[3] => 16.png
[4] => 18.png
[5] => 24.png
[6] => 26.png
[7] => 28.png
[8] => 30.png
[9] => 32.png
[10] => 34.png
[11] => 36.png
[12] => 38.png
[13] => 4.png
[14] => 40.png
[15] => 42.png
[16] => 44.png
[17] => 47.png
[18] => 48.png
[19] => 51.png
[20] => 52.png
[21] => 55.png
[22] => 56.png
[23] => 6.png
[24] => 8.png
[25] => Thumbs.db
)

[/xampp/htdocs/www.abpstickers.com.ua/4/] => Array
(
[0] => 10.png
[1] => 12.png
[2] => 18.png
[3] => 22.png
[4] => 26.png
[5] => 4.png
[6] => 8.png
[7] => Thumbs.db
)

[/xampp/htdocs/www.abpstickers.com.ua/5/] => Array
(
[0] => 10.png
[1] => 11.png
[2] => 12.png
[3] => 13.png
[4] => 14.png
[5] => 15.png
[6] => 16.png
[7] => 17.png
[8] => 2.png
[9] => 3.png
[10] => 4.png
[11] => 5.png
[12] => 6.png
[13] => 7.png
[14] => 8.png
[15] => 9.png
[16] => Thumbs.db
)

[/xampp/htdocs/www.abpstickers.com.ua/6/] => Array
(
[0] => 10.png
[1] => 11.png
[2] => 12.png
[3] => 13.png
[4] => 14.png
[5] => 15.png
[6] => 16.png
[7] => 17.png
[8] => 18.png
[9] => 19.png
[10] => 2.png
[11] => 20.png
[12] => 21.png
[13] => 22.png
[14] => 23.png
[15] => 24.png
[16] => 25.png
[17] => 26.png
[18] => 27.png
[19] => 28.png
[20] => 3.png
[21] => 4.png
[22] => 5.png
[23] => 6.png
[24] => 7.png
[25] => 8.png
[26] => 9.png
[27] => Thumbs.db
)

[/xampp/htdocs/www.abpstickers.com.ua/7/] => Array
(
[0] => 10.png
[1] => 11.png
[2] => 12.png
[3] => 13.png
[4] => 14.png
[5] => 15.png
[6] => 16.png
[7] => 17.png
[8] => 18.png
[9] => 19.png
[10] => 2.png
[11] => 3.png
[12] => 4.png
[13] => 5.png
[14] => 6.png
[15] => 7.png
[16] => 8.png
[17] => 9.png
[18] => Thumbs.db
)

[/xampp/htdocs/www.abpstickers.com.ua/8/] => Array
(
[0] => 10.png
[1] => 11.png
[2] => 12.png
[3] => 13.png
[4] => 14.png
[5] => 15.png
[6] => 16.png
[7] => 17.png
[8] => 18.png
[9] => 19.png
[10] => 2.png
[11] => 20.png
[12] => 21.png
[13] => 22.png
[14] => 23.png
[15] => 24.png
[16] => 3.png
[17] => 4.png
[18] => 5.png
[19] => 6.png
[20] => 7.png
[21] => 8.png
[22] => 9.png
[23] => Thumbs.db
)

)

Спустя 6 часов, 38 минут, 5 секунд (7.09.2011 - 07:44) linker написал(а):
Не в открытой, а в текущей из которой выполняется скрипт. Для is_file(), is_dir() и т.п. необходимо указывать полный путь к файлам, папкам, ссылкам, если хотите, чтобы у вас всё правильно работало.

Спустя 2 часа, 58 минут, 18 секунд (7.09.2011 - 10:42) Игорь_Vasinsky написал(а):
ну вот и прояснилось biggrin.gif


_____________
Гнусный социопат с комплексом Бога.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.