SYNOPSIS
        #include <files.h>

        mixed * get_dir(string str)
        mixed * get_dir(string str, int mask)

BESCHREIBUNG
        Benoetigt einen Pfad als erstes Argument und liefert ein Feld
        (Array) mit Dateinamen bzw. Eigenschaften der gefundenen Dateien im
        angegebenen Verzeichnis.

        Liefert 0 zurueck, wenn es das Verzeichnis, in dem gesucht werden
        soll, nicht gibt.

        Der Dateinamen-Teil des Pfades darf "*" und "?" als Platzhalter
        enthalten: jeder "*" steht fuer eine beliebige Anzahl Zeichen (oder
        sich selber), "?" fuer ein beliebiges Zeichen. Entsprechend liefert
        get_dir("/pfad/*") ein alphabetisch sortiertes Feld aller Dateien
        im Verzeichnis "/pfad" oder ({ "/pfad/*" }), wenn es diese Datei
        geben sollte.

        Gibt man den Pfad eines Verzeichnisses mit abschliessendem "/" oder
        "/." an (z. B. get_dir("/pfad/.")), so erhaelt man den Inhalt des
        Verzeichnisses. Um Informationen ueber das Verzeichnis selber zu
        erhalten, muss man den Pfad des Verzeichnisses angeben.

        Das optionale zweite Argument ist eine Bitmaske, mit der man
        angeben kann, welche Informationen man ueber die angegebenen
        Dateien erhalten moechte.

        GETDIR_EMPTY    (0x00)  get_dir() liefert ein leeres Feld (nicht
                                wirklich sinnvoll)
        GETDIR_NAMES    (0x01)  liefert die alphabetisch sortierten
                                Dateinamen.
        GETDIR_SIZES    (0x02)  liefert die unsortierten Dateigroessen
                                (file_size()), Verzeichnisse haben die
                                Dateigroesse FSIZE_DIR (-2).
        GETDIR_DATES    (0x04)  liefert die unsortierten Zeiten der jeweils
                                letzten Aenderung in Sekunden seit dem
                                01.01.1970.
        GETDIR_ACCESS   (0x40)  liefert die unsortierten Zeiten des jeweils
                                letzten Zugriffes in Sekunden seit dem
                                01.01.1970.
        GETDIR_MODES    (0x80)  liefert die Filemode-Maske

        GETDIR_ALL      (0xDF)  Liefert all Werte zurueck.

        GETDIR_PATH     (0x10)  Dateinamen werden als volle Pfade geliefert.
                                (ein ev. fehlendes GETDIR_NAMES wird als
                                vorhanden angenommen).
        GETDIR_UNSORTED (0x20)  Das Ergebnis wird nicht sortiert.

        Wichtig: Man muss GETDIR_NAMES|GETDIR_UNSORTED verwenden, wenn man
        die Eintraege in der selben Reihenfolge wie bei GETDIR_SIZES und
        GETDIR_DATES haben moechte.

        Die Eintraege in der Bitmaske koennen miteinander kombiniert
        werden.

ANMERKUNGEN
        Der als Argument angegebene Pfad wird vor Benutzung von valid_read()
        im Master der Mudlib verarbeitet. Hierbei kann die Mudlib eine
        Normalisierung vornehmen (z.B. fuehrende und endstaendige "/"
        entfernen). Dann fuehrt dann u.U. zu erwarteten Resultaten (z.B. dass
        get_dir("/dir/", ...) nicht den Inhalt von /dir/ zurueckgibt).
        Compat mode: GETDIR_PATH liefert die Pfade ohne fuehrenden /.

BEISPIELE
        Funktion                         Rueckgabewert
        -------------------------------------------------------------------
        get_dir("/obj/.")                Alle Dateien, die im Verzeichnis
                                         /obj enthalten sind.
        get_dir("/obj/")                 Wie get_dir("/obj/").

        get_dir("/obj/schwert.c")        ({ "schwert.c" }), sofern
                                         /obj/schwert.c existiert (als
                                         Datei oder Verzeichnis), ansonsten
                                         ({}), sofern /obj ein Verzeichnis
                                         ist, ansonsten 0.

        get_dir("/obj/*")                ({ "*" }), sofern * existiert.
                                         Ansonsten und normalerweise ein
                                         alphabetisch sortiertes Feld mit
                                         den Namen aller Dateien und
                                         Verzeichnisse in /obj, sofern /obj
                                         ein Verzeichnis ist, ansonsten 0.

        get_dir("/obj/schwert.c", GETDIR_SIZES)
                                         ({ <Groesse von /obj/schwert.c> }),
                                         sofern /obj/schwert.c existiert.
        get_dir("/obj/.", GETDIR_NAMES)  Wie get_dir("/obj/.").
        get_dir("/obj/.", GETDIR_SIZES)  Ein unsortiertes Feld mit den
                                         Groessen der Dateien in /obj.
        get_dir("/obj/.", GETDIR_NAMES|GETDIR_SIZES|GETDIR_DATES)
            oder kuerzer
        get_dir("/obj/.", GETDIR_ALL)    Ein eindimensionales und nach
                                         Namen sortiertes Feld, das fuer
                                         jede Datei in /obj den Namen, die
                                         Groesse und den Zeitpunkt der
                                         letzten Aenderung enthaelt, z.B.
                                           ({
                                              "axt.c"    ,  927, 994539583,
                                              "schwert.c", 1283, 998153903,
                                           }).

        get_dir("/obj/schwert.c", GETDIR_NAMES|GETDIR_PATH)
                                         ({ "/obj/sword.c" }), sofern
                                         vorhanden.
        get_dir("/obj/schwert.c", GETDIR_PATH)  Kurzform dafuer.

        transpose_array(({ get_dir(str, GETDIR_NAMES|GETDIR_UNSORTED)
                         , get_dir(str, GETDIR_SIZES)
                         , get_dir(str, GETDIR_DATES) }));
        Liefert ein unsortiertes Feld mit Feldern, von denen ein jedes
        Name, Groesse und Zeit einer Datei enthaelt, z. B.
          ({
             ({ "schwert.c", 1283, 998153903 }),
             ({ "axt.c"    ,  927, 994539583 }),
          }).

GESCHICHTE
        LDMud 3.2.9: GETDIR_PATH eingefuehrt.
        LDMud 3.2.11: GETDIR_ACCESS und GETDIR_MODES eingefuehrt.

SIEHE AUCH
        mkdir(E), rmdir(E), file_size(E), write_file(E), write_bytes(E),
        read_file(E), read_bytes(E)
