Listing files in a directory is a common task in PHP, useful for file management, creating galleries, listing logs, or scanning directories for processing. PHP provides several methods to list files and directories using built-in functions like scandir(), opendir(), readdir(), and glob().
This tutorial covers:
Table of Contents
1. Listing Files Using scandir()
The scandir() function returns an array of filenames in a directory.
Example: Basic Listing of Files
$dir = "example_folder"; $files = scandir($dir); print_r($files);
Output Example
Array ( [0] => . [1] => .. [2] => file1.txt [3] => image.jpg [4] => subfolder )
Explanation
- “.” and “..” represent the current and parent directories.
- The function returns all files and directories in the specified path.
2. Filtering Files and Ignoring . and ..
Since scandir() includes . and .., we can filter them out.
Example: Ignore . and ..
$dir = "example_folder"; $files = array_diff(scandir($dir), array('.', '..')); print_r($files);
Output
Array ( [2] => file1.txt [3] => image.jpg [4] => subfolder )
Use Case: Cleaning up directory listings.
3. Checking If It’s a File or a Directory
To differentiate between files and directories, use is_dir().
Example: Separate Files and Directories
$dir = "example_folder"; $files = array_diff(scandir($dir), array('.', '..')); foreach ($files as $file) { if (is_dir("$dir/$file")) { echo "[DIR] $file\n"; } else { echo "[FILE] $file\n"; } }
Output
[FILE] file1.txt [FILE] image.jpg [DIR] subfolder
Use Case: Generating a structured file manager.
4. Listing Files Using opendir() and readdir()
The opendir() function opens a directory, and readdir() reads filenames one by one.
Example: List Files One by One
$dir = "example_folder"; if ($handle = opendir($dir)) { while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { echo "$file\n"; } } closedir($handle); }
Explanation
- opendir() opens a directory.
- readdir() reads each entry one at a time.
- closedir() closes the directory after processing.
Use Case: Memory-efficient when handling large directories.
5. Using glob() for Pattern Matching
The glob() function allows filtering files by extensions or patterns.
Example: Get Only .txt Files
$txtFiles = glob("example_folder/*.txt"); print_r($txtFiles);
Output
Array ( [0] => example_folder/file1.txt [1] => example_folder/log.txt )
Use Case: Selecting specific file types like *.jpg, *.pdf, etc.
6. Listing Files Recursively (Subdirectories)
To list all files, including subdirectories, we need recursion.
Example: Recursively List Files in a Directory
function listFilesRecursive($dir) { $files = scandir($dir); foreach ($files as $file) { if ($file == "." || $file == "..") continue; $filePath = "$dir/$file"; if (is_dir($filePath)) { echo "[DIR] $filePath\n"; listFilesRecursive($filePath); // Recursive call } else { echo "[FILE] $filePath\n"; } } } listFilesRecursive("example_folder");
Output
[DIR] example_folder/subfolder [FILE] example_folder/subfolder/note.txt [FILE] example_folder/file1.txt [FILE] example_folder/image.jpg
Explanation
- Uses recursion to scan nested folders.
- Detects directories and calls itself recursively.
Use Case: Searching for files, backup scripts, or generating file trees.
7. Combining Filters and Sorting
We can sort files by name, size, or date.
Example: Sorting Files by Last Modified Date
$dir = "example_folder"; $files = array_diff(scandir($dir), array('.', '..')); usort($files, function($a, $b) use ($dir) { return filemtime("$dir/$a") - filemtime("$dir/$b"); }); print_r($files);
Explanation
- filemtime($file) gets the last modified timestamp.
- usort() sorts files by modification time.
Use Case: Sorting log files or media files by date.
8. Creating an HTML File List
To display files in a web page, we can generate an HTML file list.
Example: Display Files as Clickable Links
$dir = "example_folder"; $files = array_diff(scandir($dir), array('.', '..')); echo "<ul>"; foreach ($files as $file) { echo "<li><a href='$dir/$file'>$file</a></li>"; } echo "</ul>";
Output (Rendered in Browser)
- file1.txt
- image.jpg
- subfolder
Use Case: Building a simple file browser.
Comparison of File Listing Methods
Method | Best For | Features |
---|---|---|
scandir() | Simple file listing | Returns an array of files & directories |
opendir() + readdir() | Large directories | Efficient, reads one file at a time |
glob() | Pattern-based search | Filters files by extensions or names |
Recursive function | Nested directories | Scans subdirectories recursively |
Conclusion
- PHP provides multiple ways to list files and directories.
- scandir() is simple and efficient for small folders.
- opendir() + readdir() is memory-efficient for large directories.
- glob() allows file filtering based on extensions.
- Recursion is needed to scan subdirectories.
- Sorting files by date, name, or size is possible using usort().
- For web applications, generate HTML links dynamically.
By understanding these methods, you can list, filter, and manipulate files efficiently in PHP for file management, automation scripts, or web-based file browsers.