Chdir: примеры (PHP)
chdir(string $directory): boolФункция chdir (change directory) изменяет текущий рабочий каталог PHP-скрипта на указанный путь. Она используется, когда необходимо переключить контекст выполнения для операций с файловой системой, например, для открытия файлов относительно нового каталога, сканирования директории или запуска внешних программ.
Функция принимает один обязательный аргумент:
- directory (string) - путь к новой текущей директории. Может быть абсолютным или относительным.
Функция возвращает true в случае успеха и false при возникновении ошибки (например, если указанный каталог не существует или отсутствуют права на доступ).
Переход в указанную папку.
$oldCwd = getcwd();
echo 'Текущий каталог до: ' . $oldCwd . '<br>';
if (chdir('/tmp')) {
echo 'Текущий каталог после: ' . getcwd() . '<br>';
} else {
echo 'Не удалось сменить директорию.<br>';
}
chdir($oldCwd); // Возврат назадТекущий каталог до: /var/www/html Текущий каталог после: /tmp
Попытка перейти в несуществующий каталог.
$result = @chdir('/несуществующий/путь');
if ($result === false) {
echo 'Ошибка смены директории.<br>';
}Ошибка смены директории.
- getcwd() - возвращает абсолютный путь текущего рабочего каталога. Часто используется вместе с chdir для сохранения и восстановления пути.
- realpath() - преобразует относительный или абсолютный путь в канонизированный абсолютный путь, убирая символические ссылки и компоненты '.' и '..'. Полезна для получения полного пути перед использованием chdir.
- dirname() - возвращает путь к родительской директории файла. Может использоваться для построения путей относительно текущего скрипта.
Функция chdir предпочтительна, когда необходимо выполнить серию операций в другой директории. Для единичных операций с файлами иногда удобнее использовать абсолютные пути, сконструированные с помощью realpath или __DIR__.
Не проверяется успешность смены каталога, что может привести к последующим ошибкам операций с файлами.
chdir('/неизвестная_директория');
$file = fopen('myfile.txt', 'r'); // Предупреждение или ошибкаWarning: fopen(myfile.txt): Failed to open stream: No such file or directory in ...
После смены директории относительные пути отсчитываются от нового расположения, что может быть неочевидно.
chdir('/var/www');
include 'config.php'; // Будет искать /var/www/config.php, а не относительно исходного скрипта.if (!chdir('/etc/passwd')) {
echo 'Это файл, а не директория.';
}Это файл, а не директория.
Функция chdir оставалась стабильной на протяжении многих версий. В PHP 8.0 не было внесено значительных изменений в её поведение или сигнатуру. Важно отметить, что с PHP 5.4 и более поздних версий, chdir() не влияет на каталог, в котором работает веб-сервер, если только он не запущен в режиме CLI. В режиме CGI или модуля веб-сервера изменение каталога обычно ограничено временем выполнения скрипта.
function processFilesInDir($dirPath) {
$oldCwd = getcwd();
if (!chdir($dirPath)) {
return false;
}
$files = scandir('.');
$result = [];
foreach ($files as $file) {
if (pathinfo($file, PATHINFO_EXTENSION) === 'txt') {
$result[] = $file;
}
}
chdir($oldCwd); // Важно вернуться
return $result;
}
print_r(processFilesInDir('/tmp'));Array
(
[0] => log1.txt
[1] => data.txt
)Использование chdir вместе с рекурсивным итератором может упростить обработку вложенных структур.
function listDirectoriesRecursively($startDir) {
$iter = new RecursiveDirectoryIterator($startDir, FilesystemIterator::SKIP_DOTS);
foreach (new RecursiveIteratorIterator($iter, RecursiveIteratorIterator::CHILD_FIRST) as $item) {
if ($item->isDir()) {
echo $item->getPathname() . "<br>";
}
}
}
// chdir здесь может не потребоваться, если использовать абсолютные пути в итераторе.chdir переходит по символическим ссылкам на директории.
// Предположим, /tmp/link -> /var/tmp
symlink('/var/tmp', '/tmp/link');
chdir('/tmp/link');
echo 'Текущий каталог: ' . getcwd();Текущий каталог: /var/tmp
$output = [];
$return_var = 0;
chdir('/tmp');
exec('ls -la', $output, $return_var); // Команда выполняется в /tmp
print_r($output);Chdir в Python
Функция os.chdir(path). При ошибке вызывает исключение OSError.
import os
old = os.getcwd()
try:
os.chdir('/tmp')
print(os.getcwd())
except OSError as e:
print(f'Ошибка: {e}')/tmp
Метод process.chdir(directory). При ошибке генерирует исключение.
const process = require('process');
let old = process.cwd();
try {
process.chdir('/tmp');
console.log(process.cwd());
} catch (err) {
console.error(`Ошибка: ${err}`);
}/tmp
Chdir в MySQL
Прямого аналога в SQL нет, так как это язык запросов к СУБД, а не для работы с файловой системой сервера.