SYNOPSIS
        #include <files.h>

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

DESCRIPTION
        This function takes a path as argument and returns an array of file
        names and attributes in that directory.

        Returns 0 if the directory to search in does not exist.

        The filename part of the path may contain '*' or '?' as wildcards:
        every '*' matches an arbitrary amount of characters (or just itself),
        a '?' matches any character. Thus get_dir("/path/*") would return an
        alphabetically sorted array of all files in directory "/path", or
        just ({ "/path/*" }) if this file happens to exist.

        To query the content of a directory, use the directory name with a
        trailing '/' or '/.', for example get_dir("/path/."). Use the
        directory name as it is to get information about the directory itself.

        The optional second argument mask can be used to get
        information about the specified files.

        GETDIR_EMPTY    (0x00)  get_dir returns an empty array (not very
                                useful).
        GETDIR_NAMES    (0x01)  put the alphabetically sorted file names into
                                the returned array.
        GETDIR_SIZES    (0x02)  put the file sizes unsorted into the returned
                                array. directories have size FSIZE_DIR (-2).
        GETDIR_DATES    (0x04)  put the file modification dates (in seconds
                                since 01/01/1970) unsorted into the
                                returned array.
        GETDIR_ACCESS   (0x40)  put the file access dates unsorted into
                                the returned array.
        GETDIR_MODES    (0x80)  put the unix file modes unsorted into
                                the returned array.

        GETDIR_ALL      (0xDF)  Return all.

        GETDIR_PATH     (0x10)  if this mask bit is set, the filenames with
                                the full path will be returned
                                (GETDIR_NAMES is implied).
        GETDIR_UNSORTED (0x20)  if this mask bit is set, the result of will
                                _not_ be sorted.

        Note: You should use GETDIR_NAMES|GETDIR_UNSORTED to get the entries
        in the same order as with GETDIR_SIZES and GETDIR_DATES.

        The values of mask can be added together.

NOTES
        The path argument to this efun is processed by valid_read() in the
        mudlib master before being used. The mudlib may normalize this path
        (e.g. strip leading or trailing "/") and this may lead to expected
        results (e.g. get_dir("/dir/", ...) not returning the contents
        of /dir/).
        COMPAT mode: GETDIR_PATH will return the paths without leading /.

EXAMPLES
        function                         returns
        -------------------------------------------------------------------
        get_dir("/obj/.")                all files contained in directory /obj.
        get_dir("/obj/")                 the same as get_dir("/obj/")

        get_dir("/obj/sword.c")          ({ "sword.c" }) if /obj/sword.c
                                         exists (it may be a file or a
                                         directory), otherwise ({ }) if
                                         /obj is a directory,
                                         otherwise 0.

        get_dir("/obj/*")                ({ "*" }) if * exists.
                                         otherwise and normally an
                                         alphabetically sorted array with all
                                         names of files and directories in
                                         /obj if /obj is a directory,
                                         otherwise 0.

        get_dir("/obj/sword.c", GETDIR_SIZES)  ({ <size of /obj/sword.c> })
                                         if that file exists.
        get_dir("/obj/.", GETDIR_NAMES)  the same as get_dir("/obj/.").
        get_dir("/obj/.", GETDIR_SIZES)  an array with the sizes of the files
                                         in /obj, not sorted by names.
        get_dir("/obj/.", GETDIR_NAMES|GETDIR_SIZES|GETDIR_DATES) or shorter
        get_dir("/obj/.", GETDIR_ALL)    an one-dimensional array that
                                         contains for each file in /obj its
                                         name, its size and its modification
                                         date, sorted by names, for example
                                           ({
                                              "axe.c"  ,  927, 994539583,
                                              "sword.c", 1283, 998153903,
                                           }).

        get_dir("/obj/sword.c", GETDIR_NAMES|GETDIR_PATH)
                                         ({ "/obj/sword.c" }) if applicable.
        get_dir("/obj/sword.c", GETDIR_PATH)  Short form of the same query.


        transpose_array(({ get_dir(str, GETDIR_NAMES|GETDIR_UNSORTED)
                         , get_dir(str, GETDIR_SIZES)
                         , get_dir(str, GETDIR_DATES) }));
        This returns an array of arrays, with filename, size and
        filetime as elements, not sorted by names, for example
          ({
             ({ "sword.c", 1283, 998153903 }),
             ({ "axe.c"  ,  927, 994539583 }),
          }).


HISTORY
        LDMud 3.2.9 added GETDIR_PATH.
        LDMud 3.2.11/3.3.648 added GETDIR_ACCESS and GETDIR_MODES.

SEE ALSO
        mkdir(E), rmdir(E), file_size(E), write_file(E), write_bytes(E),
        read_file(E), read_bytes(E)
