Serve files and directories from a directory and its subdirectories using sendFile.

Usage:

serveDirectory EnableBrowsing ["index.html"] "path/to/files/on/disk"

If the requested path does not match a file or directory on the
disk, then serveDirectory calls mzero.

If the requested path is a file then the file is served normally.

If the requested path is a directory, then the result depends on
what the first two arguments to the function are.

The first argument controls whether directory browsing is
enabled.

The second argument is a list of index files (such as
index.html).

When a directory is requested, serveDirectory will first try to
find one of the index files (in the order they are listed). If that
fails, it will show a directory listing if EnableBrowsing is set,
otherwise it will return forbidden "Directory index forbidden".

Here is an explicit list of all the possible outcomes when the
argument is a (valid) directory:

a function to generate an HTML table showing the contents of a directory on the disk

This function generates most of the content of the
renderDirectoryContents page. If you want to style the page
differently, or add google analytics code, etc, you can just create
a new page template to wrap around this HTML.