{ my @fq; # files my @dq; # directories my $currentDir; sub initDir { push @dq, shift; }; sub getNextFile { my $f; if ( $#fq >= 0 ) { $f = pop @fq; } else { if ( $#dq >= 0 ) { my $r; # filename read local *D; $currentDir = pop @dq; opendir(D, $currentDir) || die "$currentDir: $!"; while ( defined( $r = readdir( D ) ) ) { next if $r =~ /^\.{1,3}$/; my $ff = $currentDir . '/' . $r; if ( -d $ff ) { push @dq, $ff; } else { push @fq, $ff; } } closedir D; $f = getNextFile(); } else { $f = undef; } } return $f; } } my $dir = "c:/inetpub"; # execution start here initDir( $dir ); my $f; my $i = 0 ; while ( defined( $f = getNextFile() ) ) { $i++; print "[$i] $f \n"; }