[vienna.pm] Re: Datei-Liste

Peter J. Holzer hjp at wsr.ac.at
Thu Apr 6 09:47:45 CDT 2000


On 2000-04-06 15:03:27 +0200, Christian Amon wrote:
> >>ich möchte alle Dateien (die Dateinamen) eines Verzeichnisses in
> >>eine Liste geschrieben haben.
> 
> Servus Gudrun,
> ich bin zwar selber Anfänger, mache mich aber trotzdem gerne wichtig.
> 
> Hier eine Lösung, die unter Win95 funktioniert:
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> open (Filehandle, ">Liste.dat");
> open (Datenaustauschhandle, "dir /os|");        #Dos-Befehl dir mit den
[...]

> Die ausgegebene Liste namens Liste.dat enthält auch allerhand Schrott.
                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Damit hast Du die zwei wesentlichen Nachteile Deiner Lösung bereits
aufgezählt. Sie verwendet ein betriebssystemabhängiges Kommando, das
außerdem einen Output liefert, den man wahrscheinlich erst
nachbearbeiten muß, wenn man ihn verwenden will.

Hier eine "reine" Perllösung:

    my $dir = ".";
    my $file = "liste.dat";

    # alle Filenamen in ein Array @files einlesen
    opendir(DIRHANDLE, $dir) or die "cannot read directory $dir: $!";
    my @files = readdir(DIRHANDLE);
    close(DIRHANDLE);


    # Das Array in ein File schreiben (ein Filename pro Zeile)
    open(FILEHANDLE, ">$file")
	or die "cannot open file $file for writing: $!";
    for $i (@files) {
	print FILEHANDLE "$i\n";
    }
    close(FILEHANDLE)
	or die "cannot close file $file: $!";

Wenn die Files alphabetisch sortiert sein sollen kann man einfach das
Array sortieren, bevor man es ins File schreibt:

    @files = sort @files;

Wenn man das Datum zu jedem File wissen will, gibt es die Funktion stat,
wobei ich zur Verbesserung der Lesbarkeit dringend das Modul File::stat
empfehle.

    use File::stat;
    use POSIX;

    [...]
    my $dirsep = "/";
    [...]

    for $i (@files) {
	my $st = stat ($dir . $dirsep . $i);
	my $datum = strftime("%Y-%m-%d %H:%M:%S",
			     localtime($st->mtime));
	print FILEHANDLE "$datum $i\n";
    }

Stat liefert Angaben über das File, wie z.B. die Größe, das Datum der
letzten Modifikation, etc.

Bei Fileoperationen (wie open oder stat) muß man im Allgemeinen (in
diesem Beispiel wäre es unnötig, weil wir das current directory lesen)
Directorynamen und Filename zusammenhängen, wobei der "/" als Separator
unter Unix und Windows funktioniert, aber nicht z.B. am Mac. Vermutlich
gibt es ein Modul, das solche Operationen portabel durchführt.

strftime formatiert den Output der localtime-Funktion. Ich habe keine
Ahnung, wieso die im POSIX-Modul (gibt es das unter Windows überhaupt?)
ist, es ist nämlich keine POSIX-Funktion, sondern eine ANSI-C-Funktion.

$lehrer_modus = 1;

    Als Hausübung dürft ihr den Output nach Datum sortieren :-)

undef $lehrer_modus;

	hp

PS: Die Programmfragmente oben sind ungetestet und enthalten vermutlich
Tipp- und sonstige Fehler.

-- 
   _  | Peter J. Holzer      | The best way to make sure something is
|_|_) | Sysadmin WSR / LUGA  |  "standard" today is to get an O'Reilly
| |   | hjp at wsr.ac.at        | book written on the topic.
__/   | http://www.hjp.at/   |   -- Casey Schaufler <casey at sgi.com>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 371 bytes
Desc: not available
Url : http://mail.pm.org/archives/vienna-pm/attachments/20000406/e6106776/attachment.bin


More information about the Vienna-pm mailing list