[Perl] directory/file herkennen

Pagina: 1
Acties:

  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 17-09 10:56

Koffie

Koffiebierbrouwer

Braaimeneer

Topicstarter
Hi,
Ik gebruik een relatief simpel Perl script om te kunnen browsen op m'n server.
Dit werkt naar behoren, echter wil ik een iets duidelijker overzicht tussen een bestand en een directory.

Het scriptje checked de grootte van de teruggekregen, en indien het 0 is, gaat 'ie er vanuit dat het een directory is.

Echter op deze manier worden bestanden die in gebruik zijn ook als een directory gezien.

Iemand enig idee hoe ik een betere controle erin kan bouwen ?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/perl/bin/perl
# Perl script that shows the contents of a directory
# v0.31  03-Aug-2000  (c) G.Knauf, info@gknw.de


$root = $ENV{'DOCUMENT_ROOT'} ;

$html=1;

$some_dir = ("$ENV{QUERY_STRING}" || "sys:");

if ($html==1) {
    print "Content-type: text/html", "\n\n";
    print "<body background=/images/mauvepat.jpg>\n";
    print "<H2>Directory of $some_dir</H2><BR><PRE><B>\n";}

else {
    print "Content-type: text/plain", "\n\n";
    print "Directory of $some_dir\n\n"};
    # opendir(DIR, $some_dir) || die "can't opendir $some_dir: $!";
    # We have to test the dir self as readdir() fails on NetWare if dir is empty!!
    die "Couldn't find dir $some_dir" if (!-d $some_dir);
    opendir(DIR,$some_dir);
    chdir $some_dir;    
    while($entry=readdir(DIR)) {
    next if ($entry eq "." or $entry eq "..");
    ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
       $atime,$mtime,$ctime,$blksize,$blocks)=lstat($entry);
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($mtime);
    $date = sprintf("%02d-%02d-%02d %02d:%02d:%02d",$mday,$mon+1,$year+1900,
       $hour,$min,$sec);

    if ($size!=0) {
 $volume = $some_dir ;
 $volume =~ s/:// ;
 print "\ File: <a href='https://www.oostindie.com/$volume/$entry' target='_blank'>$entry</a> " ;


} 
else {
print "\ Directory: <a href='/perl/dir.pl?$some_dir/$entry'>$entry</a> "

};

    if ($html==1) {print "<BR>"}
    else {print "\n"};
    }
    closedir DIR;
if ($html==1) {print "</B></PRE>\n"};
exit (0);

Braaikamer - Smoke&BBQ


Verwijderd

Koffie: Het scriptje checked de grootte van de teruggekregen, en indien het 0 is, gaat 'ie er vanuit dat het een directory is.
:o
Iemand enig idee hoe ik een betere controle erin kan bouwen?
Met de filetests -d en -f (voor direcotory en file resp).

Mooier script komt zo. :)

  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 17-09 10:56

Koffie

Koffiebierbrouwer

Braaimeneer

Topicstarter
He ... ik heb ook alleen maar een /copy gedaan hoor ;)

Vervolgens ben ik ik een beetje gaan lopen rommelen.

Dit is het originele script:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/perl/bin/perl
# Perl script that shows the contents of a directory
# v0.31  03-Aug-2000  (c) G.Knauf, info@gknw.de
#
$html=1;

$some_dir = ("$ENV{QUERY_STRING}" || "/novonyx/suitespot/docs/oostindie.com");

if ($html==1) {
    print "Content-type: text/html", "\n\n";
    print "<body background=/images/mauvepat.jpg>\n";
    print "<H2>Directory of $some_dir</H2><BR><PRE><B>\n";}
else {
    print "Content-type: text/plain", "\n\n";
    print "Directory of $some_dir\n\n"};
    # opendir(DIR, $some_dir) || die "can't opendir $some_dir: $!";
    # We have to test the dir self as readdir() fails on NetWare if dir is empty!!
    die "Couldn't find dir $some_dir" if (!-d $some_dir);
    opendir(DIR,$some_dir);
    chdir $some_dir;    
    while($entry=readdir(DIR)) {
    next if ($entry eq "." or $entry eq "..");
    ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
       $atime,$mtime,$ctime,$blksize,$blocks)=lstat($entry);
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($mtime);
    $date = sprintf("%02d-%02d-%02d %02d:%02d:%02d",$mday,$mon+1,$year+1900,
       $hour,$min,$sec);
    if (-d _) {print "d"} else {print "-"};
    if (-r _) {print "r"} else {print "-"};
    if (-w _) {print "w"} else {print "-"};
    if (-x _) {print "x"} else {print "-"};
    if (-R _) {print "r"} else {print "-"};
    if (-W _) {print "w"} else {print "-"};
    if (-X _) {print "x"} else {print "-"};
    if (-u _) {print "u"} else {print "-"};
    if (-g _) {print "g"} else {print "-"};
    if (-k _) {print "k"} else {print "-"};
    if (-T _) {print "\ttxt"} else {print "\tbin"};
    print "\t$uid\t$gid\t$size\t$date\t$entry";
    if ($html==1) {print "<BR>"}
    else {print "\n"};
    }
    closedir DIR;
if ($html==1) {print "</B></PRE>\n"};
exit (0);

Braaikamer - Smoke&BBQ


Verwijderd

Koffie: He ... ik heb ook alleen maar een /copy gedaan hoor ;)
Ik ben maar wat gaan spelen met die andere versie terwijl al die #55s voorbij kwamen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/perl/bin/perl -w

use strict;

my $host = "www.oostindie.com";
my $root = $ENV{'DOCUMENT_ROOT'};
my $dir  = $ENV{'QUERY_STRING'} || "sys:";

print "Content-type: text/html\n\n";
print <<"HEADER";
<html>
<head>
  <title>Directory Listing for $dir</title>
</head>
<body background="/images/mauvepat.jpg">
<h2>Directory Listing for $dir</h2>
<pre><b>
HEADER

(my $vol = $dir) =~ s/://;
opendir(DIR, $dir) or die "Cannot open dir $dir: $!";
chdir $dir or die "Cannot change to dir $dir: $!";
while (readdir(DIR)) {
    next if ($_ eq "." or $_ eq "..");
    if ( -d ) {
      print qq(<a href="/perl/dir.pl?$dir/$_">$_/</a>);
    } else {
      print qq(<a href="https://$host/$vol/$_">$_</a>);
    }
    print "<br>\n";
}
closedir DIR;

print <<"FOOTER";
</b></pre>
</body>
</html>
FOOTER

# done

Syntax is in ieder geval ok (rest niet getest). :)

  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 17-09 10:56

Koffie

Koffiebierbrouwer

Braaimeneer

Topicstarter
't ziet er goed uit, echter kan ik nu niet testen (kan ff gen perl scripts uploaden naar m'n server).
'k Zal 'm vanavond ff aanmakenen testen.

In ieder geval reuze bedankt voor het meehelpen :Y) !!

Braaikamer - Smoke&BBQ


  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 17-09 10:56

Koffie

Koffiebierbrouwer

Braaimeneer

Topicstarter
Wat doe je met het volgende:
code:
1
  if ( -d ) {

Hij loopt namelijk gigantisch mis op dat stuk:
Directory Listing for sys:

Use of uninitialized value at dir2.pl line 23.
Use of uninitialized value at dir2.pl line 23.
Use of uninitialized value at dir2.pl line 24.
Use of uninitialized value at dir2.pl line 24.
Use of uninitialized value at dir2.pl line 24.
Use of uninitialized value at dir2.pl line 24.
/
Use of uninitialized value at dir2.pl line 23.
Use of uninitialized value at dir2.pl line 23.
Use of uninitialized value at dir2.pl line 24.
Use of uninitialized value at dir2.pl line 24.
Use of uninitialized value at dir2.pl line 24.
Use of uninitialized value at dir2.pl line 24.
/
En zo gaat 'ie een lange tijd door.

Braaikamer - Smoke&BBQ


Verwijderd

Oops :o
code:
1
2
3
4
5
6
7
8
9
while ($_ = readdir(DIR)) {        # <=== REGEL VERANDEREN
    next if /^[.][.]?$/;
    if ( -d ) {
      print qq(<a href="/perl/dir.pl?$dir/$_">$_/</a>);
    } else {
      print qq(<a href="https://$host/$vol/$_">$_</a>);
    }
    print "<br>\n";
}

  • Onno
  • Registratie: Juni 1999
  • Niet online
<negeer dit>
test
</negeer dit>

Verwijderd

Onno: <negeer dit>test</negeer dit>
<negeer wat="dit">
Dat is natuurlijk geen XML...
</negeer>


:P

  • Onno
  • Registratie: Juni 1999
  • Niet online
:D
Pagina: 1