list_files

The timeline below displays how wordpress function list_files has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

WordPress Version: 6.3

/**
 * Returns a listing of all files in the specified folder and all subdirectories up to 100 levels deep.
 *
 * The depth of the recursiveness can be controlled by the $levels param.
 *
 * @since 2.6.0
 * @since 4.9.0 Added the `$exclusions` parameter.
 * @since 6.3.0 Added the `$include_hidden` parameter.
 *
 * @param string   $folder         Optional. Full path to folder. Default empty.
 * @param int      $levels         Optional. Levels of folders to follow, Default 100 (PHP Loop limit).
 * @param string[] $exclusions     Optional. List of folders and files to skip.
 * @param bool     $include_hidden Optional. Whether to include details of hidden ("." prefixed) files.
 *                                 Default false.
 * @return string[]|false Array of files on success, false on failure.
 */
function list_files($folder = '', $levels = 100, $exclusions = array(), $include_hidden = false)
{
    if (empty($folder)) {
        return false;
    }
    $folder = trailingslashit($folder);
    if (!$levels) {
        return false;
    }
    $files = array();
    $dir = @opendir($folder);
    if ($dir) {
        while (($file = readdir($dir)) !== false) {
            // Skip current and parent folder links.
            if (in_array($file, array('.', '..'), true)) {
                continue;
            }
            // Skip hidden and excluded files.
            if (!$include_hidden && '.' === $file[0] || in_array($file, $exclusions, true)) {
                continue;
            }
            if (is_dir($folder . $file)) {
                $files2 = list_files($folder . $file, $levels - 1, array(), $include_hidden);
                if ($files2) {
                    $files = array_merge($files, $files2);
                } else {
                    $files[] = $folder . $file . '/';
                }
            } else {
                $files[] = $folder . $file;
            }
        }
        closedir($dir);
    }
    return $files;
}

WordPress Version: 5.7

/**
 * Returns a listing of all files in the specified folder and all subdirectories up to 100 levels deep.
 *
 * The depth of the recursiveness can be controlled by the $levels param.
 *
 * @since 2.6.0
 * @since 4.9.0 Added the `$exclusions` parameter.
 *
 * @param string   $folder     Optional. Full path to folder. Default empty.
 * @param int      $levels     Optional. Levels of folders to follow, Default 100 (PHP Loop limit).
 * @param string[] $exclusions Optional. List of folders and files to skip.
 * @return string[]|false Array of files on success, false on failure.
 */
function list_files($folder = '', $levels = 100, $exclusions = array())
{
    if (empty($folder)) {
        return false;
    }
    $folder = trailingslashit($folder);
    if (!$levels) {
        return false;
    }
    $files = array();
    $dir = @opendir($folder);
    if ($dir) {
        while (($file = readdir($dir)) !== false) {
            // Skip current and parent folder links.
            if (in_array($file, array('.', '..'), true)) {
                continue;
            }
            // Skip hidden and excluded files.
            if ('.' === $file[0] || in_array($file, $exclusions, true)) {
                continue;
            }
            if (is_dir($folder . $file)) {
                $files2 = list_files($folder . $file, $levels - 1);
                if ($files2) {
                    $files = array_merge($files, $files2);
                } else {
                    $files[] = $folder . $file . '/';
                }
            } else {
                $files[] = $folder . $file;
            }
        }
        closedir($dir);
    }
    return $files;
}

WordPress Version: 5.5

/**
 * Returns a listing of all files in the specified folder and all subdirectories up to 100 levels deep.
 *
 * The depth of the recursiveness can be controlled by the $levels param.
 *
 * @since 2.6.0
 * @since 4.9.0 Added the `$exclusions` parameter.
 *
 * @param string   $folder     Optional. Full path to folder. Default empty.
 * @param int      $levels     Optional. Levels of folders to follow, Default 100 (PHP Loop limit).
 * @param string[] $exclusions Optional. List of folders and files to skip.
 * @return bool|string[] False on failure, else array of files.
 */
function list_files($folder = '', $levels = 100, $exclusions = array())
{
    if (empty($folder)) {
        return false;
    }
    $folder = trailingslashit($folder);
    if (!$levels) {
        return false;
    }
    $files = array();
    $dir = @opendir($folder);
    if ($dir) {
        while (($file = readdir($dir)) !== false) {
            // Skip current and parent folder links.
            if (in_array($file, array('.', '..'), true)) {
                continue;
            }
            // Skip hidden and excluded files.
            if ('.' === $file[0] || in_array($file, $exclusions, true)) {
                continue;
            }
            if (is_dir($folder . $file)) {
                $files2 = list_files($folder . $file, $levels - 1);
                if ($files2) {
                    $files = array_merge($files, $files2);
                } else {
                    $files[] = $folder . $file . '/';
                }
            } else {
                $files[] = $folder . $file;
            }
        }
        closedir($dir);
    }
    return $files;
}

WordPress Version: 5.3

/**
 * Returns a listing of all files in the specified folder and all subdirectories up to 100 levels deep.
 * The depth of the recursiveness can be controlled by the $levels param.
 *
 * @since 2.6.0
 * @since 4.9.0 Added the `$exclusions` parameter.
 *
 * @param string   $folder     Optional. Full path to folder. Default empty.
 * @param int      $levels     Optional. Levels of folders to follow, Default 100 (PHP Loop limit).
 * @param string[] $exclusions Optional. List of folders and files to skip.
 * @return bool|string[] False on failure, else array of files.
 */
function list_files($folder = '', $levels = 100, $exclusions = array())
{
    if (empty($folder)) {
        return false;
    }
    $folder = trailingslashit($folder);
    if (!$levels) {
        return false;
    }
    $files = array();
    $dir = @opendir($folder);
    if ($dir) {
        while (($file = readdir($dir)) !== false) {
            // Skip current and parent folder links.
            if (in_array($file, array('.', '..'), true)) {
                continue;
            }
            // Skip hidden and excluded files.
            if ('.' === $file[0] || in_array($file, $exclusions, true)) {
                continue;
            }
            if (is_dir($folder . $file)) {
                $files2 = list_files($folder . $file, $levels - 1);
                if ($files2) {
                    $files = array_merge($files, $files2);
                } else {
                    $files[] = $folder . $file . '/';
                }
            } else {
                $files[] = $folder . $file;
            }
        }
        closedir($dir);
    }
    return $files;
}

WordPress Version: 5.1

/**
 * Returns a listing of all files in the specified folder and all subdirectories up to 100 levels deep.
 * The depth of the recursiveness can be controlled by the $levels param.
 *
 * @since 2.6.0
 * @since 4.9.0 Added the `$exclusions` parameter.
 *
 * @param string   $folder     Optional. Full path to folder. Default empty.
 * @param int      $levels     Optional. Levels of folders to follow, Default 100 (PHP Loop limit).
 * @param string[] $exclusions Optional. List of folders and files to skip.
 * @return bool|string[] False on failure, else array of files.
 */
function list_files($folder = '', $levels = 100, $exclusions = array())
{
    if (empty($folder)) {
        return false;
    }
    $folder = trailingslashit($folder);
    if (!$levels) {
        return false;
    }
    $files = array();
    $dir = @opendir($folder);
    if ($dir) {
        while (($file = readdir($dir)) !== false) {
            // Skip current and parent folder links.
            if (in_array($file, array('.', '..'), true)) {
                continue;
            }
            // Skip hidden and excluded files.
            if ('.' === $file[0] || in_array($file, $exclusions, true)) {
                continue;
            }
            if (is_dir($folder . $file)) {
                $files2 = list_files($folder . $file, $levels - 1);
                if ($files2) {
                    $files = array_merge($files, $files2);
                } else {
                    $files[] = $folder . $file . '/';
                }
            } else {
                $files[] = $folder . $file;
            }
        }
    }
    @closedir($dir);
    return $files;
}

WordPress Version: 4.9

/**
 * Returns a listing of all files in the specified folder and all subdirectories up to 100 levels deep.
 * The depth of the recursiveness can be controlled by the $levels param.
 *
 * @since 2.6.0
 * @since 4.9.0 Added the `$exclusions` parameter.
 *
 * @param string $folder Optional. Full path to folder. Default empty.
 * @param int    $levels Optional. Levels of folders to follow, Default 100 (PHP Loop limit).
 * @param array  $exclusions Optional. List of folders and files to skip.
 * @return bool|array False on failure, Else array of files
 */
function list_files($folder = '', $levels = 100, $exclusions = array())
{
    if (empty($folder)) {
        return false;
    }
    $folder = trailingslashit($folder);
    if (!$levels) {
        return false;
    }
    $files = array();
    $dir = @opendir($folder);
    if ($dir) {
        while (($file = readdir($dir)) !== false) {
            // Skip current and parent folder links.
            if (in_array($file, array('.', '..'), true)) {
                continue;
            }
            // Skip hidden and excluded files.
            if ('.' === $file[0] || in_array($file, $exclusions, true)) {
                continue;
            }
            if (is_dir($folder . $file)) {
                $files2 = list_files($folder . $file, $levels - 1);
                if ($files2) {
                    $files = array_merge($files, $files2);
                } else {
                    $files[] = $folder . $file . '/';
                }
            } else {
                $files[] = $folder . $file;
            }
        }
    }
    @closedir($dir);
    return $files;
}

WordPress Version: 4.1

/**
 * Returns a listing of all files in the specified folder and all subdirectories up to 100 levels deep.
 * The depth of the recursiveness can be controlled by the $levels param.
 *
 * @since 2.6.0
 *
 * @param string $folder Optional. Full path to folder. Default empty.
 * @param int    $levels Optional. Levels of folders to follow, Default 100 (PHP Loop limit).
 * @return bool|array False on failure, Else array of files
 */
function list_files($folder = '', $levels = 100)
{
    if (empty($folder)) {
        return false;
    }
    if (!$levels) {
        return false;
    }
    $files = array();
    if ($dir = @opendir($folder)) {
        while (($file = readdir($dir)) !== false) {
            if (in_array($file, array('.', '..'))) {
                continue;
            }
            if (is_dir($folder . '/' . $file)) {
                $files2 = list_files($folder . '/' . $file, $levels - 1);
                if ($files2) {
                    $files = array_merge($files, $files2);
                } else {
                    $files[] = $folder . '/' . $file . '/';
                }
            } else {
                $files[] = $folder . '/' . $file;
            }
        }
    }
    @closedir($dir);
    return $files;
}

WordPress Version: 3.7

/**
 * Returns a listing of all files in the specified folder and all subdirectories up to 100 levels deep.
 * The depth of the recursiveness can be controlled by the $levels param.
 *
 * @since 2.6.0
 *
 * @param string $folder Full path to folder
 * @param int $levels (optional) Levels of folders to follow, Default: 100 (PHP Loop limit).
 * @return bool|array False on failure, Else array of files
 */
function list_files($folder = '', $levels = 100)
{
    if (empty($folder)) {
        return false;
    }
    if (!$levels) {
        return false;
    }
    $files = array();
    if ($dir = @opendir($folder)) {
        while (($file = readdir($dir)) !== false) {
            if (in_array($file, array('.', '..'))) {
                continue;
            }
            if (is_dir($folder . '/' . $file)) {
                $files2 = list_files($folder . '/' . $file, $levels - 1);
                if ($files2) {
                    $files = array_merge($files, $files2);
                } else {
                    $files[] = $folder . '/' . $file . '/';
                }
            } else {
                $files[] = $folder . '/' . $file;
            }
        }
    }
    @closedir($dir);
    return $files;
}