Список всех файлов директории

Ноябрь

Новичок
Список всех файлов директории

Есть ли способы получить список всех файлов директории,не используя базу данных..?
 

Фанат

oncle terrible
Команда форума
хммм.
ты уверен, что правильно понимаешь, для чего служит база данных? =)
а способ есть.
особенно, если думать не о базе данных, а о файловых функциях =)
 

kruglov

Новичок
[m]readdir[/m]

Но вы, в свою очередь, расскажите, как получить список файлов, используя базу данных
 

Ноябрь

Новичок
под базой данных я имел ввиду список файлов (например в тектовом документе..)
т.е "получить" никак неполучится, но заведомо можно записать все файлы:)
 

HEm

Сетевой бобер
Да, гораздо интереснее был бы вопрос "Есть ли способы получить список всех файлов директории, используя базу данных..?"
Ноябрь
под базой данных я имел ввиду список файлов (например в тектовом документе..)
т.е "получить" никак неполучится, но заведомо можно записать все файлы
Чем этот способ отличается от генерирования списка файлов в директории случайным образом?
 

romy4

invoke [brain]
`ls -r` или `dir /S` а дальше регекспом и/или задавай дополнительные опции вывода
 

rob72

Новичок
Не знаю насчет баз данных...
Вычисляет размеры (в частности) для заданной и всех вложенных (можно с маской)
Проверено.
<?php
class MY_DIR{
var $dir_size;
function MY_DIR($d){
$this->dir_size=0;
printf("<hr><b><u>DirName: %s </u></b><br>\n",realpath($d));
$s=$this->scan($d);
printf("<u>DirSize: %s</u><hr>\n",$this->dir_size);
echo $s;
}
//--
function scan($dirname){
GLOBAL $OBS;
$out_str='';
$dp=opendir($dirname);
while($file=readdir($dp)){//
//--Если директория--
if(is_dir($file)&&!eregi("\.",$file)){
$OBS[$file]=new MY_DIR($file);
}
elseif(!eregi("\.(txt)$",$file)){continue;}
else{
$fs=@filesize($file);
if(!is_numeric($fs)){$fs='<b><u>undefined</u></b>';}
else{$this->dir_size+=$fs;}
$out_str.=sprintf("FileName: %s; FileSize: %s<br>\n",$file,$fs);
}
}//End_while
return $out_str;
}//End_func
//--
}//End_class
//--Собственно, обработка начинается здесь----------------
$total_size=0;
$OBS=array();//Массив объектов-директорий
$dir_name='.';//Директория, с которой начинаем
$OBS[$dir_name]=new MY_DIR($dir_name);
foreach($OBS AS $ob){
$total_size+=$ob->dir_size;
}
printf("_______<u>TotalSize: %s</u>_______<hr>\n",$total_size);
?>
Результат:
<hr><b><u>DirName: y:\home\test.ru\www </u></b><br>
<hr><b><u>DirName: y:\home\test.ru\www\bg51x121 </u></b><br>
<u>DirSize: 0</u><hr>
<hr><b><u>DirName: y:\home\test.ru\www\cgi-bin </u></b><br>
<u>DirSize: 178</u><hr>
FileName: a.txt; FileSize: 113<br>
FileName: b.txt; FileSize: 65<br>
FileName: c.txt; FileSize: 0<br>
<hr><b><u>DirName: y:\home\test.ru\www\img </u></b><br>
<u>DirSize: 0</u><hr>
<u>DirSize: 178</u><hr>
FileName: a.txt; FileSize: 113<br>
FileName: b.txt; FileSize: 65<br>
FileName: c.txt; FileSize: 0<br>
_______<u>TotalSize: 356</u>_______<hr>
 

clops

Новичок
кошмар какой -- а чем нативный класс PHP dir() не устроил?
 

clops

Новичок
а что конкретно не сложилось? (кстати, есть ещё http://ru2.php.net/glob/ о которой мало кто знает)

с дир я бы сделал примерно так (пишу наскорую руку не тестируя)
PHP:
function readDir($path='./'){
$d = dir($path);
while (false !== ($entry = $d->read())) {
  if($entry == '.' or $entry == '..'){
    continue;
  }

  if(is_dir($path.$entry){
    readDir($path.$entry);
  }

  echo $path . $entry."<br />\n";
}
$d->close();
}

readDir();
 

rob72

Новичок
После исправления явных синтаксических ошибок имеем;
В папке кроме скрипта три пустые вложенные :subdir1, в ней subdir2 и в ней subdir3
И еще времянки сует DREAMWEAVER
PHP:
<?php
function my_readDir($path='./'){ 
$d = dir($path); 
while (false !== ($entry = $d->read())) { 
  if($entry == '.' or $entry == '..')continue;
		if(is_dir($path.$entry)){ 
  		my_readDir($path.$entry); 
		} 
echo $path.$entry."<br />\n"; 
} 
$d->close(); 
} 
my_readDir();
?>
Результат
./subdir1subdir2
./subdir1
./TMP3pbqoy6abj.php
./TMP3pxeyy6acb.php
./untitled.php
 

clops

Новичок
ах ну что вы сразу -- цепляетесь к тому что я люблю визуально более читабельный код, а «косую» после $path.$entry в вызов функции добавить не догадались ;)
 

rob72

Новичок
Да я не цепляюсь, просто сам тоже на скорую руку тестировал, особенно не вникал. А директорию одну ведь проглотил бесследно... А вообще, интересно было бы обойтись без массива объектов.
 

clops

Новичок
ну это объект нативный, а потому и работать будет быстрее построчного чтения файлов ;) (проглотил опять же из-за отсутствия косой, потому что условие на тестирования дириктории не срабатывает тогда)
 

rob72

Новичок
Так, все, сажусь капитально...
PHP:
<?php 
	function my_readDir($path='./'){  
$d=dir($path);  
while(false!==($entry=$d->read())){
  if(($entry== '.')||($entry=='..'))continue; 
        if(is_dir($path.'/'.$entry)){//Вот это мне нравится, остроумно, сам не додумался
        my_readDir($path.'/'.$entry);
        }  
echo $path.'/'.$entry."<br />\n";  
}  
$d->close();  
}//End_func
my_readDir(); 
?>
Блестяще! лучшая реализация из всего, что я видел
 
Сверху