2012-05-23 2 views
1

В настоящее время я пишу программу, которая в конечном итоге будет сравнивать файлы в двух каталогах и отображать функции, которые были изменены в каждом файле. Тем не менее, я столкнулся с проблемой при проверке, является ли то, что находится в каталоге, является файлом или является подкаталогом. Прямо сейчас, когда я проверяю, является ли это просто каталогом с проверкой -d, он не попадает ни в один из подкаталогов. Я разместил часть своего кода ниже.Perl: определение того, является ли вход файлом или каталогом

opendir newDir, $newDir; 
my @allNewFiles = grep { $_ ne '.' and $_ ne '..'} readdir newDir; 
closedir newDir; 

opendir oldDir, $oldDir; 
my @allOldFiles = grep { $_ ne '.' and $_ ne '..'} readdir oldDir; 
closedir oldDir; 


foreach (@allNewFiles) { 
    if(-d $_) { 
     print "$_ is not a file and therefore is not able to be compared\n\n"; 
    } elsif((File::Compare::compare("$newDir/$_", "$oldDir/$_") == 1)) { 
     print "$_ in new directory $newDirName differs from old directory $oldDirName\n\n"; 
     print OUTPUTFILE "File: $_ has been update. Please check marked functions for differences\n"; 
     print OUTPUTFILE "\n\n"; 
     print OUTPUTFILE "+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=\n\n"; 
    } elsif((File::Compare::compare("$newDir/$_", "$oldDir/$_") < 0)) { 
     print "$_ found in new directory $newDirName but not in old directory $oldDirName\n"; 
     print "Entire file not printed to output file but instead only file name\n"; 
     print OUTPUTFILE "File: $_ is a new file!\n\n"; 
     print OUTPUTFILE "+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=\n\n"; 
    } 
} 

foreach (@allOldFiles) { 
    if((File::Compare::compare("$newDir/$_", "$oldDir/$_") < 0)) { 
     print "$_ found in old directory $oldDirName but not in new directory $newDirName\n\n"; 
    } 
} 

Благодарим за помощь!

+0

две вещи: 1. Bareword ручки плохо (конечно, вы сказали, это потому, что вы 'использовать строги и' предупреждения использования; ', * right *?) и 2. почему бы не просто 'grep {-f $ _}' на 'readdir' дескриптора каталога? –

+0

Я использую строгое использование; и использовать предупреждения; И когда я попытался использовать grep {-f $ _}, он не прочитал бы никаких файлов, кроме файлов perl. – Kat

+0

Затем запустите. Если вы не делаете бросок с одним слоем, вы должны «использовать строгую» и «использовать предупреждения» в каждом отдельном коде Perl, который вы пишете. –

ответ

6

Как perldoc -f readdir гласит:

Если вы планируете filetest возвращаемых значений из ReadDir, вы бы лучше предварять каталог в вопросе. В противном случае, потому что мы не chdir там, это было бы тестирование неправильного файла.

if(-d "$newDir/$_") { 
1

Используйте рекурсивный вызов, чтобы сначала получить список файлов, а затем работать с ними.

my $filesA = {}; 
my $filesB = {}; 

# you are passing in a ref to filesA or B so no return is needed. 
sub getFiles { 
    my ($dir, $fileList) = @_; 

    foreach my $file (glob("*")) { 
    if(-d $file) { 
     getFiles($dir . "/" . $file, $fileList); # full relative path saved 
    } else { 
     $fileList{$dir . "/" . $file}++;   # only files are put into list 
    } 
    } 
} 

# get the files list 
my $filesA = getFiles($dirA); 
my $filesB = getFiles($dirB); 

# check them by using the keys from the 2 lists created. 
3

использование Path::Class

use strict; 
use warnings; 
use Path::Class; 


my @allNewFiles = grep { !$_->is_dir } dir("/newDir")->children; 
Смежные вопросы