is_dir() is one of the built-in functions in PHP, which is used to determine whether a path is an existing directory:
<code> $path = '/var/www/html/uploads'; if (is_dir($path)) { echo "This is a valid directory"; } else { echo "This path is not a directory or does not exist"; } </code>This function returns a boolean value true or false based on the real file system status on the server.
Try to use absolute paths when calling is_dir() . The relative path may fail due to changes in the current working directory (CWD). For example:
<code> $relativePath = 'images'; $absolutePath = __DIR__ . '/images'; if (is_dir($absolutePath)) {
// Recommended method
}
</code>
realpath() can normalize the path, remove relative path components such as ../ , and also identify soft links. Combined with is_dir() , path verification can be performed more efficiently:
<code> $path = realpath('/var/www/html/uploads'); if ($path !== false && is_dir($path)) { // Make sure that the path exists and is a directory} </code>When getting paths from user input, be sure to filter dangerous characters such as ... to avoid directory traversal attacks. It can be combined with regular expressions or whitelisting mechanisms:
<code> $input = $_GET['dir'] ?? ''; if (preg_match('/^[a-zA-Z0-9_\-\/]+$/', $input)) { $path = realpath('/var/www/html/' . $input); if ($path !== false && is_dir($path)) { // Secure Access} } </code>Although is_dir() will return false for non-existent paths, if you need more rigorous inspection logic, you can first use file_exists() to make a judgment:
<code> $path = '/var/www/html/uploads'; if (file_exists($path) && is_dir($path)) { // More stringent verification} </code>Symbol links may cause is_dir() to behave differently than expected. For example, if a link points to a directory that does not exist, is_dir() will also return false. You can use is_link() in conjunction with:
<code> $path = '/var/www/html/uploads'; if (is_link($path)) { echo "This is a symbolic link"; } elseif (is_dir($path)) { echo "This is a real directory"; } </code>Permissions issue : Even if the directory exists, is_dir() may return false if PHP does not have read permissions.
Performance issues : Frequent calls to is_dir() to check a large number of paths may cause I/O pressure, and it is recommended to cache verified paths.
Multi-platform compatibility : Path separators are different on Windows and Linux, and it is recommended to use DIRECTORY_SEPARATOR or uniformly use / .
$realBase = realpath($baseDir);
if ($realBase === false || !is_dir($realBase)) {
return $dirs;
}
$entries = scandir($realBase);
foreach ($entries as $entry) {
if ($entry === '.' || $entry === '..') {
continue;
}
$fullPath = $realBase . DIRECTORY_SEPARATOR . $entry;
if (is_dir($fullPath)) {
$dirs[] = $entry;
}
}
return $dirs;
}
$uploadDirs = listUploadDirs('/var/www/gitbox.net/uploads');
print_r($uploadDirs);
</code>
This code safely lists all subdirectories in the specified directory and takes into account path normalization and basic security processing.