|
|
|
| Хочу написать обход файловой системы без использования scan_dir.
Не как не написать. | |
|
|
|
|
|
|
|
для: Akira
(21.07.2005 в 21:04)
| | Я такое задание выполнял в паскале, в универе.
Рекурсивный обход, то есть, начиная с корня, забиваешь в массив все директории и ЭТОЙ же функцией залазишь в каждую. Функция должна вызывать сама себя, покуда все директории не кончатся по всему дереву. Думаю, со скриптом на РНР у Вас получится в любом случае лучше, чем у меня.... В общем, теория. :)
Ах, да! Добавляю в сообщение:
$dir = opendir ("$nextdir");
while ( $file = readdir ($dir))
{
if (( $file != ".") && ($file != ".."))
{
$unit[$i]=$file
$i++;
}
}
closedir ($dir);
|
Эдак мы забиваем в массив контент директории $nextdir...
И при этом не используем scandir(). | |
|
|
|
|
|
|
|
для: DJ Paltus
(21.07.2005 в 21:30)
| | Да я и алгоритм выробатал, но как на ПХП у меня не получается :( | |
|
|
|
|
|
|
|
|
для: cheops
(21.07.2005 в 22:46)
| | Да :) Я не могу найти это :) Спасибо. | |
|
|
|
|
|
|
|
для: 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" ?? По-моему они не нужны. Т.к. этих переменных не сущ. | |
|
|
|
|
|
|
|
для: Akira
(21.07.2005 в 23:06)
| | 1) Чтобы если файл на или директория начинаются с 0 не происходило сбоя - такое имя будет интерпретироваться как false без !==
2) Там внизу рабочий вариант - первый сбойный, параметры ,$fd,$fb - нужно убрать. | |
|
|
|
|
|
|
|
для: cheops
(21.07.2005 в 23:32)
| | Понятно, интересно , а можно скрипт облегчить используя glob? У меня как-то не получилось, потому, что стал виснуть Апач :( | |
|
|
|
|
|
|
|
для: 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.' ');
} 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>';
}
?>
|
| |
|
|
|
|
|
|
|
для: isset
(22.07.2005 в 01:12)
| | А зачем изобретать колесо? :)
http://php.net/scandir | |
|
|
|
|
|
|
|
для: Akira
(22.07.2005 в 01:23)
| | Т.к. эта функция только в PHP 5 появилась, а итераторами если делать, то намного удобнее (выше я уже привел пример, можно например узнать размер файла, полный путь к нему, права , владельца, группу ....) да и просто украсить список можно :) | |
|
|
|
|
|
|
|
для: isset
(22.07.2005 в 01:27)
| | Лично для меня этот код просто набор символов, который трудно прочитать. :))
Я думаю, что несколько комментариев не помешало бы. | |
|
|
|
|
|
|
|
для: Akira
(22.07.2005 в 01:42)
| | Будто я понимаю что пишу :-) | |
|
|
|
|
|
|
|
для: isset
(22.07.2005 в 02:34)
| | :) По-моему это общая проблема програмистов ;)) Мне на пример иногда требуеться до 5 мин. что бы осмыслить что я написал и как это работает :) | |
|
|
|
|
|
|
|
для: Akira
(22.07.2005 в 00:42)
| | Глобальные переменные обычно только запутывают код, если есть возможность написать код без них - нужно поступать именно так - это потом окупится. Использовать их следует только тогда, когда вообще никак не получается без них обойтись. | |
|
|
|
|
|
|
|
для: 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("");
?>
|
| |
|
|
|