Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Обход файловой системы
 
 автор: Akira   (21.07.2005 в 21:04)   письмо автору
 
 

Хочу написать обход файловой системы без использования scan_dir.
Не как не написать.

   
 
 автор: DJ Paltus   (21.07.2005 в 21:30)   письмо автору
 
   для: Akira   (21.07.2005 в 21:04)
 

Я такое задание выполнял в паскале, в универе.
Рекурсивный обход, то есть, начиная с корня, забиваешь в массив все директории и ЭТОЙ же функцией залазишь в каждую. Функция должна вызывать сама себя, покуда все директории не кончатся по всему дереву. Думаю, со скриптом на РНР у Вас получится в любом случае лучше, чем у меня.... В общем, теория. :)
Ах, да! Добавляю в сообщение:


 $dir = opendir ("$nextdir");
  while ( $file = readdir ($dir))
  {
    if (( $file != ".") && ($file != ".."))
          {
           $unit[$i]=$file
           $i++;
          }
  }
  closedir ($dir);

Эдак мы забиваем в массив контент директории $nextdir...
И при этом не используем scandir().

   
 
 автор: Akira   (21.07.2005 в 21:46)   письмо автору
 
   для: DJ Paltus   (21.07.2005 в 21:30)
 

Да я и алгоритм выробатал, но как на ПХП у меня не получается :(

   
 
 автор: cheops   (21.07.2005 в 22:46)   письмо автору
 
   для: Akira   (21.07.2005 в 21:46)
 

PHP-код можно найти в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=1718

   
 
 автор: Akira   (21.07.2005 в 23:05)   письмо автору
 
   для: cheops   (21.07.2005 в 22:46)
 

Да :) Я не могу найти это :) Спасибо.

   
 
 автор: Akira   (21.07.2005 в 23:06)   письмо автору
 
   для: Akira   (21.07.2005 в 23:05)
 


<?

 
function scan_dir($dirname
  { 
    
// Открываем текущую директорию 
    
$dir opendir($dirname); 
    
// Читаем в цикле директорию 
    
while (($file readdir($dir)) !== false
    { 
      
// Если файл обрабатываем его содержимое 
      
if($file != "." && $file != ".."
      { 
        
// Если имеем дело с файлом - регистрируем его 
        
if(is_file($dirname."/".$file)) 
        { 
          echo 
$dirname."/".$file." - "
               
date("m.d.y",filemtime($dirname."/".$file))." - "
               
filesize($dirname."/".$file)."<br>"
        } 
        
// Если перед нами директория, вызываем рекурсивно 
        // функцию scan_dir 
        
if(is_dir($dirname."/".$file)) 
        { 
          echo 
$dirname."/".$file."<br>"
          
scan_dir($dirname."/".$file,$fd,$fb); 
        } 
      } 
    } 
    
// Закрываем директорию 
    
closedir($dir); 
  }
   
scan_dir('../');
?>

Можно обьяснить, что означает (!==) не индентично?
И зачем в scan_dir($dirname."/".$file,$fd,$fb) ",$fd,$fb" ?? По-моему они не нужны. Т.к. этих переменных не сущ.

   
 
 автор: cheops   (21.07.2005 в 23:32)   письмо автору
 
   для: Akira   (21.07.2005 в 23:06)
 

1) Чтобы если файл на или директория начинаются с 0 не происходило сбоя - такое имя будет интерпретироваться как false без !==
2) Там внизу рабочий вариант - первый сбойный, параметры ,$fd,$fb - нужно убрать.

   
 
 автор: Akira   (22.07.2005 в 00:42)   письмо автору
 
   для: cheops   (21.07.2005 в 23:32)
 

Понятно, интересно , а можно скрипт облегчить используя glob? У меня как-то не получилось, потому, что стал виснуть Апач :(

   
 
 автор: isset   (22.07.2005 в 01:12)   письмо автору
 
   для: Akira   (22.07.2005 в 00:42)
 

Написал для PHP5 :

<?php
function list_dir($dit,$nbsp='') {
   for( ; 
$dit->valid(); $dit->next()) {
       if(
$dit->isDir() && !$dit->isDot()) {
           echo 
$nbsp.' - <b>'.$dit->current().':</b><br>';
           if(
$dit->hasChildren()) echo list_dir($dit->getChildren(),$nbsp.'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;');
       } elseif(
$dit->isFile()) echo $nbsp.$dit->current().' (<i>'.$dit->getSize().' байт</i>)<br>';
   }
}
list_dir(new RecursiveDirectoryIterator('c:/www'));
?>


Правда если только файлы нужны:

<php
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator('./')) as $list) {
    echo $list->current().'<br>';
}
?>

   
 
 автор: Akira   (22.07.2005 в 01:23)   письмо автору
 
   для: isset   (22.07.2005 в 01:12)
 

А зачем изобретать колесо? :)
http://php.net/scandir

   
 
 автор: isset   (22.07.2005 в 01:27)   письмо автору
 
   для: Akira   (22.07.2005 в 01:23)
 

Т.к. эта функция только в PHP 5 появилась, а итераторами если делать, то намного удобнее (выше я уже привел пример, можно например узнать размер файла, полный путь к нему, права , владельца, группу ....) да и просто украсить список можно :)

   
 
 автор: Akira   (22.07.2005 в 01:42)   письмо автору
 
   для: isset   (22.07.2005 в 01:27)
 

Лично для меня этот код просто набор символов, который трудно прочитать. :))
Я думаю, что несколько комментариев не помешало бы.

   
 
 автор: isset   (22.07.2005 в 02:34)   письмо автору
 
   для: Akira   (22.07.2005 в 01:42)
 

Будто я понимаю что пишу :-)

   
 
 автор: Akira   (22.07.2005 в 10:35)   письмо автору
 
   для: isset   (22.07.2005 в 02:34)
 

:) По-моему это общая проблема програмистов ;)) Мне на пример иногда требуеться до 5 мин. что бы осмыслить что я написал и как это работает :)

   
 
 автор: cheops   (22.07.2005 в 12:38)   письмо автору
 
   для: Akira   (22.07.2005 в 00:42)
 

Глобальные переменные обычно только запутывают код, если есть возможность написать код без них - нужно поступать именно так - это потом окупится. Использовать их следует только тогда, когда вообще никак не получается без них обойтись.

   
 
 автор: Akira   (29.07.2005 в 13:55)   письмо автору
 
   для: Akira   (21.07.2005 в 23:06)
 

Альтернатива

<?php 
function scan_dir($dirname

    
# Если путь пустой, то используем текущий каталог 
    
empty($dirname) ? $dirname "*" $dirname $dirname."/*"
    
$dir glob($dirname); 
     if (
$dir
     { 
         foreach(
$dir as $filename
             { 
                 
                if (
is_file($filename)) 
                { 
                     echo 
"$filename - "
                      echo 
date("m.d.y",filemtime($filename))." - "
                      echo 
filesize($filename)."<br>"
                } 
                if (
is_dir($filename)) 
                { 
                    
scan_dir($filename); 
                    echo 
"$filename <br />"
                } 
             } 
         } 
     } 
scan_dir(""); 
?>

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования