Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Выборка файлов из папки
Форумы портала PHP.SU » » Работа с файловой системой и файлами » Выборка файлов из папки

Страниц (1): [1]
 

1. dzheka3d - 03 Августа, 2011 - 22:47:12 - перейти к сообщению
Здравствуйте всем! Подскажите пожалуйста, каким образом можно организовать такую функцию:
есть папка, в ней еще куча папок и в каждой этой папке лежат кучи файлов (в некоторых папках есть еще папки в которых тоже файлы).
Нужно, что бы скрипт выбрал из каждой папки по 3 файла и переместил их в такие же папки в другой директории.
2. ams - 03 Августа, 2011 - 23:05:13 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. $h = opendir(" . ");
  3.  
  4. while($e = readdir($h))
  5. {
  6. if (is_file($e))
  7. {
  8. // выбираешь свой
  9. }
  10. if (is_dir($e))
  11. {
  12. // орять readdir и т.д.. )
  13. }
  14. }
  15.  
3. dzheka3d - 03 Августа, 2011 - 23:23:24 - перейти к сообщению
У меня всего около 50 папок в некоторых их которых еще по 20-70 это очень много получится if (is_dir($e))
При этом не возможно выбрать папки из папок

Но все равно спасибо за отзыв
4. Arni - 03 Августа, 2011 - 23:27:23 - перейти к сообщению
dzheka3d пишет:
У меня всего около 50 папок в некоторых их которых еще по 20-70 это очень много получится if (is_dir($e))


Это называется рекурсия.

PHP:
скопировать код в буфер обмена
  1.  
  2. function reedallfiles_($dir,$skip,&$query){
  3.     $file_list = scandir($dir);
  4.     for($i = 0; isset($file_list[$i]); $i++){
  5.        if($file_list[$i] != '.'
  6.        && $file_list[$i] != '..'
  7.        && $file_list[$i] != ''
  8.        && !isset($skip[$dir.'/'.$file_list[$i]])){
  9.           if(is_file($dir.'/'.$file_list[$i])){
  10.               echo $dir.'/'.$file_list[$i];
  11.           }else{
  12.               echo $dir.'/'.$file_list[$i];
  13.               reedallfiles($dir.'/'.$file_list[$i],$skip,$query);
  14.           }
  15.        }
  16.     }
  17. }
  18.  
5. dzheka3d - 03 Августа, 2011 - 23:36:10 - перейти к сообщению
Спасибо большое, буду разбираться, надеюсь всё получится Улыбка
(Добавление)
Все что мог, пояснил для себя, но что-то не сходится... Или я что-то не так пояснил?

PHP:
скопировать код в буфер обмена
  1.  
  2. function reedallfiles_($dir,$skip,&$query){
  3.     $file_list = scandir($dir); // получаем список файлов и папок и заносим массив в переменную $file_list
  4.     for($i = 0; isset($file_list[$i]); $i++){ // пока существуют элементы массива выполняем:
  5.        if($file_list[$i] != '.' // если имя файла .
  6.        && $file_list[$i] != '..' // если имя файла ..
  7.        && $file_list[$i] != ''  // если файл не имеет имени
  8.        && !isset($skip[$dir.'/'.$file_list[$i]])){ // и не существует файла в дирректории (что такое $skip не понятно)
  9.           if(is_file($dir.'/'.$file_list[$i])){ // если файл существует
  10.               echo $dir.'/'.$file_list[$i]; // выводим адрес файла
  11.           }else{
  12.               echo $dir.'/'.$file_list[$i]; // в противном случае выводим адрес файла
  13.               reedallfiles($dir.'/'.$file_list[$i],$skip,$query); // тут не понятно
  14.           }
  15.        }
  16.     }
  17. }
  18.  
6. Arni - 04 Августа, 2011 - 00:03:46 - перейти к сообщению
там где вам не понятно, это и есть рекурсия. Функция вызывает сама себя. Тоисть, как только функция находит папку, она вызывает саму себя, и процес как бы переносится в глюбь новой папки, и.т.д аж пока не будет достигнута самая удаленная папка, после чего рекурсия начнет вылазить обратно. Чтобы лутше это понять представьте себе нить, котьрую тянут с корня каталога и через все папки поочереди в глубь и обратно. Рекурсия остановится как только будет обработан последний файл.
7. dzheka3d - 04 Августа, 2011 - 00:06:31 - перейти к сообщению
Я даже не предполагал что так возможно Улыбка (что бы функция сама себя могла вызвать)
А что означают эти переменные:
?
8. Arni - 04 Августа, 2011 - 00:15:34 - перейти к сообщению
dzheka3d пишет:
А что означают эти переменные:


Сори это моя фишка и вам это ненадо. Я же не писал это все по новой Улыбка. Взял с готового кода для примера, вот и зацепилось. $skip это массив имен файлов, все имена которые туда внесены будут пропущены. Имя с учетом пути к файлу. &$query это мы передаем указатель на переменную, тоисть при повторном вызове, функция не создает новую переменную, а обращается по указателю на $query. Таким образом мы не теряем информацию на всех уровнях вложенности. в общем если skip, не нужен то можно выкинуть.

 

Powered by ExBB FM 1.0 RC1