В процессе разработки сайтов на 1С-Битрикс нередко возникает задача очистки каталога от определённых файлов. Встроенная функция DeleteDirFiles()
позволяет автоматизировать удаление всех файлов из одной директории, имена которых совпадают с файлами в другой директории, при этом можно исключить часть файлов от удаления.

В данной статье мы подробно рассмотрим, как работает функция DeleteDirFiles()
, разберём её параметры, приведём реальные примеры использования и обратим внимание на особенности работы с файлами и путями в Bitrix.
1. Описание функции DeleteDirFiles()
DeleteDirFiles(
string $frDir,
string $toDir,
array $arExept = array()
);
Функция удаляет из каталога, переданного во втором параметре ($toDir
), все файлы, имена которых найдены в каталоге, переданном в первом параметре ($frDir
). Она не производит рекурсивного обхода — то есть не заходит во вложенные папки. Поэтому для удаления файлов из вложенных директорий потребуется свой собственный рекурсивный код или другие инструменты.
Параметры функции
frDir
Абсолютный или относительный путь к каталогу, файлы которого проверяются на наличие в каталоге
toDir
. Пример:$_SERVER["DOCUMENT_ROOT"]."/temp2"
или"temp2"
(относительный путь относительно текущей директории).toDir
Абсолютный или относительный путь к каталогу, из которого требуется удалить файлы, имена которых были найдены в
frDir
. Пример:$_SERVER["DOCUMENT_ROOT"]."/temp1"
или"temp1"
.arExept
Массив с названиями файлов, которые не будут удалены, даже если они существуют в обеих директориях. Пример:
array("index.php")
.
Важно понимать, что данная функция не проверяет содержимое файлов, их размеры или даты изменения. Удаление происходит исключительно по совпадающим именам файлов из frDir
и toDir
.
2. Как работает функция внутри
Ниже приведён исходный код функции из модуля bitrix/modules/main/tools.php
. Если в вашем проекте код слегка отличается, ориентируйтесь на принцип работы:
function DeleteDirFiles($frDir, $toDir, $arExept = array())
{
if (is_dir($frDir))
{
$d = dir($frDir);
while ($entry = $d->read())
{
if ($entry == "." || $entry == "..")
continue;
// Если имя файла в списке исключений, пропускаем
if (in_array($entry, $arExept))
continue;
// Удаляем файл из $toDir
@unlink($toDir."/".$entry);
}
$d->close();
}
}
Алгоритм простой:
- Функция проверяет, что
$frDir
действительно является директорией. - Сканирует все файлы в
$frDir
. - Пропускает служебные элементы
.
и..
. - Смотрит, есть ли название текущего файла в массиве
$arExept
. Если оно там — не удаляем. - Если нет — выполняется команда
unlink()
для файла с таким же именем в$toDir
.
Обратите внимание, что никакая дополнительная логика (например, проверка существования файла в $toDir
, проверка поддиректорий и т.п.) не применяется: функция просто пытается удалить файл по совпадающему имени. Поэтому если вы передаёте некорректный путь в $toDir
или файла там нет, PHP выбросит предупреждение (подавляемое в примере через @unlink
).
3. Примеры использования
Ниже приведены различные варианты использования функции. В большинстве случаев достаточно передать абсолютные пути (популярный подход в Bitrix — использовать $_SERVER["DOCUMENT_ROOT"]
):
Пример 1. Удаление файлов без исключений
// Удаляем из папки /temp1/ все файлы, которые есть в папке /temp2/
DeleteDirFiles(
$_SERVER["DOCUMENT_ROOT"]."/temp2",
$_SERVER["DOCUMENT_ROOT"]."/temp1"
);
- frDir:
$_SERVER["DOCUMENT_ROOT"]."/temp2"
- toDir:
$_SERVER["DOCUMENT_ROOT"]."/temp1"
Все файлы, имена которых совпадают, будут удалены из /temp1/
.
Пример 2. Удаление с одним исключением
// Удаляем из папки /temp1/ все файлы, которые есть в папке /temp2/,
// за исключением файла exclude.txt
DeleteDirFiles(
$_SERVER["DOCUMENT_ROOT"]."/temp2",
$_SERVER["DOCUMENT_ROOT"]."/temp1",
array("exclude.txt")
);
Массив array("exclude.txt")
означает, что файл exclude.txt
никогда не будет удалён, даже если он присутствует в обеих папках.
Пример 3. Удаление с несколькими исключениями
// Удаляем из папки /temp1/ все файлы, которые есть в папке /temp2/,
// за исключением файлов index.php и config.php
DeleteDirFiles(
$_SERVER["DOCUMENT_ROOT"]."/temp2",
$_SERVER["DOCUMENT_ROOT"]."/temp1",
array("index.php", "config.php")
);
Пример 4. Использование относительных путей
// Удаляем файлы из temp1 на основе файлов в temp2,
// используя относительные пути
DeleteDirFiles("temp2", "temp1");
В некоторых случаях (в зависимости от текущей рабочей директории PHP) можно использовать относительные пути, однако в Bitrix разработчики чаще применяют абсолютные пути через $_SERVER["DOCUMENT_ROOT"]
, чтобы избежать путаницы.
Пример 5. Удаление файлов в папке uploads
,
основываясь на списке файлов в папке backups
:
// Удаляем файлы из папки uploads, которые также существуют в папке backups
DeleteDirFiles(
$_SERVER["DOCUMENT_ROOT"]."/backups",
$_SERVER["DOCUMENT_ROOT"]."/uploads"
);
Пример 6. Исключение файлов с определённым расширением
// Удаляем из папки /images все файлы,
// которые есть в папке /temp_images,
// за исключением файлов с расширением .jpg
DeleteDirFiles(
$_SERVER["DOCUMENT_ROOT"]."/temp_images",
$_SERVER["DOCUMENT_ROOT"]."/images",
array("*.jpg")
);
Обратите внимание, что использование шаблонов ("*.jpg"
) в исключениях может не работать “из коробки” — базовая реализация DeleteDirFiles()
просто ищет точное совпадение имени файла. Если нужна поддержка масок, потребуется дописать дополнительную логику или передавать конкретные файлы в массиве исключений.
Пример 7. Удаление временных файлов из temp1
// Удаляем временные файлы из папки /temp1/,
// которые есть в папке /temp2
DeleteDirFiles(
$_SERVER["DOCUMENT_ROOT"]."/temp2",
$_SERVER["DOCUMENT_ROOT"]."/temp1"
);
Пример 8. Удаление всех файлов в archive
,
которые обнаружены в current
DeleteDirFiles(
$_SERVER["DOCUMENT_ROOT"]."/current",
$_SERVER["DOCUMENT_ROOT"]."/archive"
);
Пример 9. Удаление файлов с несколькими важными исключениями
// Удаляем файлы из папки /project_files,
// которые есть в папке /template_files,
// исключая config.json и settings.xml
DeleteDirFiles(
$_SERVER["DOCUMENT_ROOT"]."/template_files",
$_SERVER["DOCUMENT_ROOT"]."/project_files",
array("config.json", "settings.xml")
);
Пример 10. Очистка папки логов
// Удаляем из папки /logs все файлы, которые есть в папке /temp_data
DeleteDirFiles(
$_SERVER["DOCUMENT_ROOT"]."/temp_data",
$_SERVER["DOCUMENT_ROOT"]."/logs"
);
4. Особенности и полезные советы
- Функция не рекурсивна
Если вам нужно удалять файлы во вложенных папках, придётся либо самостоятельно пройтись рекурсивно по директории, либо воспользоваться другими функциями Bitrix (например,
DeleteDirFilesEx
, которая удаляет каталоги целиком), либо написать свою собственную логику обхода папок. - Обработка ошибок
В коде функции используется
@unlink()
, что означает подавление ошибок. Если нужно получать уведомления об ошибках (например, в лог-файлы), стоит убрать@
или обработать возможные ситуации вручную. - Работа с масками файлов
Стандартная реализация не умеет сравнивать по шаблонам (типа
*.php
). Если вам надо удалить все.php
-файлы, дополните функционал или используйте цикл с проверкой расширений файлов. - Абсолютные пути
Чаще всего разработчики на 1С-Битрикс используют конструкцию
$_SERVER["DOCUMENT_ROOT"]
, чтобы избежать неоднозначности путей, особенно если скрипт запускается не из корневого каталога сайта. - Безопасность
- Будьте аккуратны с путями: если неправильно указать переменные, можно удалить файлы не из той папки.
- Данная функция удалит только файлы, но не папки. Если нужны операции с папками, смотрите другие функции Bitrix (например,
DeleteDirFilesEx()
).
5. Заключение
Функция DeleteDirFiles()
— это удобный инструмент в 1С-Битрикс, когда необходимо быстро очистить одну директорию на основе совпадающих имён файлов из другой директории, не вдаваясь в рекурсивный обход. Она полезна при обновлениях, тестировании, переносе контента, а также при удалении временных или резервных копий.
Главные моменты, которые стоит помнить при работе с ней:
- Не обрабатывает вложенные директории.
- Работает только по совпадающему имени файла.
- Позволяет настроить список исключённых файлов.
- Лучше использовать абсолютные пути через
$_SERVER["DOCUMENT_ROOT"]
.
Надеемся, что данное руководство и примеры помогут вам эффективно использовать DeleteDirFiles()
в своих проектах на 1С-Битрикс. Если задача по обработке директорий сложнее (например, рекурсивное удаление), стоит дополнять этот функционал собственным кодом или другими функциями фреймворка.