Файловая система в Битрикс D7: IO\File и IO\Directory
Зачем Main\IO
В D7 файловые операции обёрнуты в объекты Bitrix\Main\IO — единый стиль с остальным ядром и меньше ручной склейки путей. Корень сайта берите из Application::getDocumentRoot().
use Bitrix\Main\Application;
use Bitrix\Main\IO;
$root = Application::getDocumentRoot();
$exportFile = new IO\File($root . '/upload/exports/report.csv');Файл IO\File
Метаданные: isExists(), getSize(), getExtension(), времена создания/изменения, getPermissions().
Чтение и запись:
$payload = $exportFile->getContents();
$exportFile->putContents($csvBody);
$exportFile->putContents("\n" . $extraRow, IO\File::APPEND);
$exportFile->rename($root . '/upload/exports/report-' . date('Y-m-d') . '.csv');
$exportFile->delete();Статические аналоги: IO\File::isFileExists($path), getFileContents, putFileContents, deleteFile — удобны для разовых скриптов миграции.
Каталог IO\Directory
$workDir = new IO\Directory($root . '/upload/tmp/job_42/');
if (!$workDir->isExists()) {
$workDir->create();
}
$archiveDir = $workDir->createSubdirectory('archive');
foreach ($workDir->getChildren() as $node) {
if ($node instanceof IO\File) {
// обработка файла
}
}IO\Path
Утилиты без создания объекта файла: IO\Path::getExtension, getName, getDirectory — полезно для логов и валидаторов путей в модуле.
Когда оставить PHP
- Потоковая обработка очень больших файлов — иногда проще
SplFileObject. - Интеграция со сторонними библиотеками, ожидающими строковый путь.
В типовом модуле на D7 для экспорта, агентов и локальных кешей IO\File / IO\Directory — разумный стандарт.
Итог
Собирайте пути от document root, проверяйте isExists(), для пакетных операций используйте статические методы. Не храните абсолютные пути в БД — только относительные от /upload/ или /local/.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии