Opendir: примеры (PHP)

Функция opendir в PHP: работа с директориями
Раздел: Работа с файловой системой
opendir(string $directory, ?resource $context = null): resource|false
Описание функции opendir

Функция opendir открывает поток директории для последующего чтения её содержимого. Она применяется для итерации по файлам и папкам внутри указанного пути.

Аргументы функции

Функция принимает два параметра:

  • directory (string) – обязательный. Путь к открываемой директории.
  • context (resource) – опциональный. Контекст потока, создаваемый функцией stream_context_create().
Возвращаемое значение

В случае успеха возвращает ресурс (resource) потока директории. В случае неудачи возвращает false и генерирует ошибку уровня E_WARNING.

Базовые примеры использования
Пример 1: Открытие директории
$dir = opendir('/path/to/directory');
if ($dir) {
    echo "Директория успешно открыта";
    closedir($dir);
} else {
    echo "Ошибка открытия директории";
}
Директория успешно открыта
Пример 2: Чтение содержимого с использованием контекста
$context = stream_context_create([]);
$dir = opendir('/path/to/directory', $context);
while (($file = readdir($dir)) !== false) {
    echo $file . "\n";
}
closedir($dir);
.
..
file1.txt
image.jpg
subdirectory
Похожие функции в PHP

В PHP существуют альтернативные способы работы с директориями:

scandir()

Сразу возвращает массив всех файлов и папок в директории. Удобен для получения полного списка без ручного чтения через цикл.

Итераторы DirectoryIterator и FilesystemIterator

Предоставляют объектно-ориентированный интерфейс для работы с файловой системой. Поддерживают фильтрацию и рекурсивный обход через RecursiveDirectoryIterator.

Позволяет искать файлы по шаблону. Возвращает массив путей, соответствующих заданному шаблону.

Типичные ошибки
Ошибка 1: Невозможно открыть директорию
$dir = opendir('/несуществующий/путь');
if ($dir === false) {
    echo "Директория не найдена";
}
Warning: opendir(/несуществующий/путь): failed to open dir: No such file or directory
Директория не найдена
Ошибка 2: Отсутствие прав доступа
$dir = opendir('/root');
if ($dir === false) {
    echo "Доступ запрещен";
}
Warning: opendir(/root): failed to open dir: Permission denied
Доступ запрещен
Ошибка 3: Неправильный тип аргумента
$dir = opendir(123); // Число вместо строки
Warning: opendir(123): failed to open dir: No such file or directory
Изменения в версиях PHP

В PHP 8.0 существенных изменений в работе opendir не было. Функция сохраняет обратную совместимость.

Важное изменение произошло в PHP 7.0, где обработка ошибок стала более строгой. Некорректный тип аргумента теперь всегда вызывает предупреждение.

Расширенные примеры
Рекурсивный обход директории
Пример php
function listDirRecursive($path) {
    $dir = opendir($path);
    while (($entry = readdir($dir)) !== false) {
        if ($entry == '.' || $entry == '..') continue;
        $fullPath = $path . '/' . $entry;
        echo $fullPath . "\n";
        if (is_dir($fullPath)) {
            listDirRecursive($fullPath);
        }
    }
    closedir($dir);
}
listDirRecursive('/path/to/directory');
/path/to/directory/file1.txt
/path/to/directory/subdirectory
/path/to/directory/subdirectory/file2.txt
Фильтрация файлов по расширению
Пример php
$dir = opendir('.');
$images = [];
while (($file = readdir($dir)) !== false) {
    if (preg_match('/\.(jpg|png|gif)$/i', $file)) {
        $images[] = $file;
    }
}
closedir($dir);
print_r($images);
Array
(
    [0] => image.jpg
    [1] => photo.png
)
Использование с контекстом для FTP
Пример php
$context = stream_context_create([
    'ftp' => [
        'overwrite' => true
    ]
]);
$dir = opendir('ftp://user:pass@example.com/', $context);
while (($file = readdir($dir)) !== false) {
    echo $file . "\n";
}
closedir($dir);
Аналоги в других языках
Python: os.listdir()
import os
files = os.listdir('/path/to/directory')
for file in files:
    print(file)
file1.txt
image.jpg
subdirectory
JavaScript (Node.js): fs.readdir()
const fs = require('fs');
fs.readdir('/path/to/directory', (err, files) => {
    if (err) throw err;
    files.forEach(file => console.log(file));
});
MySQL: чтение директорий

MySQL не предоставляет прямых функций для чтения файловой системы с целью безопасности.

PHP opendir function comments

En
Opendir Open directory handle