[WIN32/PERL] filetest -d parameter geeft wisselend resultaat

Pagina: 1
Acties:

  • Wimmel
  • Registratie: Februari 2001
  • Laatst online: 30-04 10:38
Perl voor Win32 v5.8.7 op WinXP SP2

Ik ben bezig met een lister die alle directories onder een gegeven rootdir uitleest. Met perl READDIR krijg je alle bestanden terug, ongeacht of het directories of files zijn. Door middel van de -d parameter kun je bepalen of een filenaam wel of niet een directory is.

Het volgende stukje code werkt, maar alleen als ik het uitvoer vanaf de te onderzoeken dir.
code:
1
2
3
4
5
6
7
8
9
10
opendir(REPLAYS, "D:/Dir1/Dir2/Dir3/Dir4") || die "could not open dir\n";

while ( $file = readdir(REPLAYS)) 
    { 
    if ( -d $file ) 
        { 
        push (@contents,$file);
        }
    } 
print "@contents";

Als ik dit uitvoer vanaf D:\ = geen resultaat.
Uitvoeren vanaf D:/Dir1/Dir2/Dir3/Dir4 = Een keurige listing van directorynamen.

Indien ik het iets anders aanpak en niet probeer te bepalen of het een file of directory is, werkt het vanaf elke plek waar ik het uitvoer. Of dat nu de root is of een subdir. Helaas dien ik dan achteraf te bepalen of iets een directory is en dat vind ik minder handig.
code:
1
2
3
opendir(REPLAYS, "D:/Dir1/Dir2/Dir3/Dir4") || die "could not open dir\n";
@test = readdir(REPLAYS);
print "@test";

Ik heb op Google gezocht, helaas geven de zoektermen 'perl readdir -d' heel veel resultaten, maar voornamelijk over de juiste syntax. Iemand met vergelijkbare problemen ben ik niet tegengekomen.
Heeft iemand voornoemd gedrag al eens eerder gezien of maak ik een denkfout?

[ Voor 4% gewijzigd door Wimmel op 21-09-2005 00:28 ]

Men are from Mars, women are meteors crashing into Mars.
Discogs


  • JaWi
  • Registratie: Maart 2003
  • Laatst online: 14-01 21:58

JaWi

maak het maar stuk hoor...

Hmm, het was even een doordenkertje, maar ik denk dat ik het weet: je readdir() call geeft de relatieve namen van de inhoud van je directory terug. Aangezien de -d operator verwacht dat de gegeven parameter een volledig pad is, geeft hij in jouw voorbeeld dus altijd false terug.
Kijk voor de grap eens naar de File::Find module, welke dit soort foutjes al wegwerkt voor je en je makkelijker in staat stelt om naar bepaalde bestanden/directories te zoeken.

Statistics are like bikinis. What they reveal is suggestive, but what they hide is vital.


  • Wimmel
  • Registratie: Februari 2001
  • Laatst online: 30-04 10:38
JaWi schreef op woensdag 21 september 2005 @ 09:35:
... je readdir() call geeft de relatieve namen van de inhoud van je directory terug....
Bedankt, heb direct een werkende oplossing gemaakt.
code:
1
2
3
4
5
6
7
8
9
10
11
$mydir="D:/Dir1/Dir2/Dir3/Dir4";
 
opendir(REPLAYS, $mydir) || die "Could not open dir $mydir\n"; 
while ( $file = readdir(REPLAYS)) 
        { 
        if ( -d $mydir."/".$file ) 
                { 
                push (@contents,$file); 
                } 
        } 
print "@contents";

Zoals je ziet heb ik nu het absolute pad naar de te testen files. Zowieso zal ik ook nog eens naar de file::find module kijken, handig om in de toekomst dit soort foutjes te voorkomen.

Men are from Mars, women are meteors crashing into Mars.
Discogs