function print_dir($d){
if($dir=opendir($d)){
while($file=readdir($dir)){
if(is_file("$d/$file")){
echo " Файл: ".$file."<br>";
}elseif(is_dir("$d/$file") && $file!='.' && $file!='..'){
echo " <font color='red'>Директория: </font>".$file."<br>";
print_dir("$d/$file");
}
}
}
}
рекурсивное чтение каталога
Код:
#!/usr/bin/perl
$dir = "/home/";
opendir(DIR, "$dir") or die;
@files = readdir DIR;
print "@files";
closedir (DIR);
$dir = "/home/";
opendir(DIR, "$dir") or die;
@files = readdir DIR;
print "@files";
closedir (DIR);
как сделать рекурсивное чтение содержимого?
это типа найти все файлы и папки и файлы во вложеных папках?
Код:
# Возвращает листинг папки и всех вложенных подпапок
function dirlist($dir, $delete_pdirs = FALSE){
if(is_dir($dir) and is_readable($dir)){
$dir_contents = scandir($dir);
if($delete_pdirs){
unset($dir_contents[array_search(".", $dir_contents)], $dir_contents[array_search("..", $dir_contents)]);
}
foreach($dir_contents as $element){
if($element != "." and $element != ".."){
if(is_dir($dir. "/" . $element)){
$dir_contents[$element] = dirlist($dir. "/" . $element, $delete_pdirs ? TRUE : FALSE);
}
}
}
return $dir_contents;
}
else{
return FALSE;
}
}
function dirlist($dir, $delete_pdirs = FALSE){
if(is_dir($dir) and is_readable($dir)){
$dir_contents = scandir($dir);
if($delete_pdirs){
unset($dir_contents[array_search(".", $dir_contents)], $dir_contents[array_search("..", $dir_contents)]);
}
foreach($dir_contents as $element){
if($element != "." and $element != ".."){
if(is_dir($dir. "/" . $element)){
$dir_contents[$element] = dirlist($dir. "/" . $element, $delete_pdirs ? TRUE : FALSE);
}
}
}
return $dir_contents;
}
else{
return FALSE;
}
}
array dirlist(string dir, [boolean delete_pdirs]);
dir - адрес директории для чтения (без конечного слеша, удалялку написать - раз плюнуть, но зачем грузить функцию?)
delete_pdirs - если установлен в TRUE, удалятся псевдодиректории "." (текущая папка) и ".." (родительская папка)
сейчас имею :
Код:
#!/usr/bin/perl -w
$dir = "/home/music/";
opendir(DIR, $dir);
while ($a=readdir(DIR)){
if ($a ne '.' && $a ne '..') {
print "$a\n";
}
}
closedir (DIR);
$dir = "/home/music/";
opendir(DIR, $dir);
while ($a=readdir(DIR)){
if ($a ne '.' && $a ne '..') {
print "$a\n";
}
}
closedir (DIR);
может использовать foreach?
Ты сам в теме назвал слово рекурсия, а где она у тебя тут?
Цитата: elvenoracle
чёт я всё-равно не пойму как это сделать на perl
сейчас имею :
может использовать foreach?
сейчас имею :
Код:
#!/usr/bin/perl -w
$dir = "/home/music/";
opendir(DIR, $dir);
while ($a=readdir(DIR)){
if ($a ne '.' && $a ne '..') {
print "$a\n";
}
}
closedir (DIR);
$dir = "/home/music/";
opendir(DIR, $dir);
while ($a=readdir(DIR)){
if ($a ne '.' && $a ne '..') {
print "$a\n";
}
}
closedir (DIR);
может использовать foreach?
а может использовать функцию? и лучше рекурсивную.... как думаешь? ;)
Цитата: shaelf
Ты сам в теме назвал слово рекурсия, а где она у тебя тут?
дык я и говорю что не знаю как
пока я могу додуматься только до того что бы делать foreach для каждого получаемого элемента при чтении каталога
Нужно определить функцию для чтения каталога и вызывать нутри неё саму себя. Примеры смотри выше. Если порыть на php.net, то найдёшь готовые варианты.
Код:
# Возвращает листинг папки и всех вложенных подпапок
function dirlist($dir){
if(is_dir($dir) and is_readable($dir)){
$dir_contents = scandir($dir);
foreach($dir_contents as $element){ // вот твой foreach
if($element != "." and $element != ".."){
if(is_dir($dir. "/" . $element)){ // если директория, то ф-я вызывает сама себя для этой директории (рекурсия)
$dir_contents[$element] = dirlist($dir. "/" . $element);
}
}
}
return $dir_contents;
}
else{
return FALSE;
}
}
function dirlist($dir){
if(is_dir($dir) and is_readable($dir)){
$dir_contents = scandir($dir);
foreach($dir_contents as $element){ // вот твой foreach
if($element != "." and $element != ".."){
if(is_dir($dir. "/" . $element)){ // если директория, то ф-я вызывает сама себя для этой директории (рекурсия)
$dir_contents[$element] = dirlist($dir. "/" . $element);
}
}
}
return $dir_contents;
}
else{
return FALSE;
}
}
Код:
sub findFiles
{
local $basePath = $_[0];
local @files = ();
recursiveSearch('');
return [sort @files];
}
sub recursiveSearch
{
my($path) = @_;
my $f;
$path .= '/'
if $path ne '';
my $fullPath = $basePath.$path;
return 0
if !opendir(local* DIR, $fullPath);
while($f = readdir(DIR))
{
next
if $f =~ /^\.+$/;
my $fullName = $fullPath.$f;
if(-d $fullName)
{
recursiveSearch($path.$f);
}
elsif(-f $fullName)
{
push(@files, $path.$f);
}
}
closedir(DIR);
}
$files = findFiles("путь");
foreach (@$files) {
print $_, "\n";
}
{
local $basePath = $_[0];
local @files = ();
recursiveSearch('');
return [sort @files];
}
sub recursiveSearch
{
my($path) = @_;
my $f;
$path .= '/'
if $path ne '';
my $fullPath = $basePath.$path;
return 0
if !opendir(local* DIR, $fullPath);
while($f = readdir(DIR))
{
next
if $f =~ /^\.+$/;
my $fullName = $fullPath.$f;
if(-d $fullName)
{
recursiveSearch($path.$f);
}
elsif(-f $fullName)
{
push(@files, $path.$f);
}
}
closedir(DIR);
}
$files = findFiles("путь");
foreach (@$files) {
print $_, "\n";
}