Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Странное поведение readdir()


Автор: rcdimon 9.7.2006, 12:29
Мне надо сканировать лиректории и выводить список найденных в них файло и папок. Необходимо различать между собой файлы и папки. Для этого у меня есть такой код:

Код

opendir(TMPDIR,'.');
        my @a = readdir (TMPDIR);    
    closedir(TMPDIR);
    
    foreach (@a){
        if (-f $_){
            print "File $_ <br>";
        } elsif (-d $_) {
            print "Path $_ <br>";
        } else {
            print "unknown $_ <br>";
        }
    }


Эта программка выводит:

Path . 
Path .. 
File 1.tst 
File admin.cgi 
File Alfa.kpf 
Path libs 
File main.cgi 
Path modules 
File Myconfig.pm 
File webcmd.cgi

То-есть все выводит верно. Показывает список и паишет кто из них папка а кто файл. Но если вместо директории . для поиска указать любую другую например ../ то он уже не может отличить папки от файлов и выводит так:

Path . 
Path .. 
unknown cgi 
unknown cgi-bin 
unknown error.log 
unknown subdomain 
unknown www

Что естественно мне не нравится... Потому что мне надо иметь возможность указывать любой путь для сканирования директории....

Подскажите пожалуйста в чем дело. 

Автор: sharq 9.7.2006, 13:49
rcdimon, все очень просто, это не readdir виноват, а разработчик.

Когда ты запускал в первый раз, то сканировалась текущая директория, т.е. - .
И для проверки файл или директория ты указывал:

Цитата(rcdimon @  9.7.2006,  13:29 Найти цитируемый пост)
-f $_

Цитата(rcdimon @  9.7.2006,  13:29 Найти цитируемый пост)
-d $_


где $_ - это имя файла/директории, кот. находятся в текущей директории.

Во второй раз ты сканировал директорию на уровень выше, а проверял прочитанные файлы/директории в текущей директории.
Т.е. при проверке ты не указал путь к прочитанным файлам/директориям.

Поэтому:
Код

my $path = 'your_path/';
opendir my $dir, $path;
foreach (readdir $dir) {
        if (-f $path.$_){
            print "File $_ <br>";
        } elsif (-d $path.$_) {
            print "Path $_ <br>";
        } else {
            print "unknown $_ <br>";
        }
}


 smile 
 

Автор: rcdimon 9.7.2006, 14:03
Вау! Супер smile smile  

Автор: r777 29.9.2007, 15:56
sharq, 

блин и плюсик не мог поставить :( 

- то, что я и искал полдня ! smile спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)