Функции для работы с файловой системой сайта в Битриксе: DeleteDirFiles()

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

Функции для работы с файловой системой сайта в Битриксе: DeleteDirFiles()

В данной статье мы подробно рассмотрим, как работает функция DeleteDirFiles(), разберём её параметры, приведём реальные примеры использования и обратим внимание на особенности работы с файлами и путями в Bitrix.

1. Описание функции DeleteDirFiles()

DeleteDirFiles(
    string $frDir,
    string $toDir,
    array $arExept = array()
);

Функция удаляет из каталога, переданного во втором параметре ($toDir), все файлы, имена которых найдены в каталоге, переданном в первом параметре ($frDir). Она не производит рекурсивного обхода — то есть не заходит во вложенные папки. Поэтому для удаления файлов из вложенных директорий потребуется свой собственный рекурсивный код или другие инструменты.

Параметры функции

  1. frDir

    Абсолютный или относительный путь к каталогу, файлы которого проверяются на наличие в каталоге toDir. Пример: $_SERVER["DOCUMENT_ROOT"]."/temp2" или "temp2" (относительный путь относительно текущей директории).

  2. toDir

    Абсолютный или относительный путь к каталогу, из которого требуется удалить файлы, имена которых были найдены в frDir. Пример: $_SERVER["DOCUMENT_ROOT"]."/temp1" или "temp1".

  3. 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();
    }
}

Алгоритм простой:

  1. Функция проверяет, что $frDir действительно является директорией.
  2. Сканирует все файлы в $frDir.
  3. Пропускает служебные элементы . и ...
  4. Смотрит, есть ли название текущего файла в массиве $arExept. Если оно там — не удаляем.
  5. Если нет — выполняется команда 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. Особенности и полезные советы

  1. Функция не рекурсивна

    Если вам нужно удалять файлы во вложенных папках, придётся либо самостоятельно пройтись рекурсивно по директории, либо воспользоваться другими функциями Bitrix (например, DeleteDirFilesEx, которая удаляет каталоги целиком), либо написать свою собственную логику обхода папок.

  2. Обработка ошибок

    В коде функции используется @unlink(), что означает подавление ошибок. Если нужно получать уведомления об ошибках (например, в лог-файлы), стоит убрать @ или обработать возможные ситуации вручную.

  3. Работа с масками файлов

    Стандартная реализация не умеет сравнивать по шаблонам (типа *.php). Если вам надо удалить все .php-файлы, дополните функционал или используйте цикл с проверкой расширений файлов.

  4. Абсолютные пути

    Чаще всего разработчики на 1С-Битрикс используют конструкцию $_SERVER["DOCUMENT_ROOT"], чтобы избежать неоднозначности путей, особенно если скрипт запускается не из корневого каталога сайта.

  5. Безопасность
    • Будьте аккуратны с путями: если неправильно указать переменные, можно удалить файлы не из той папки.
    • Данная функция удалит только файлы, но не папки. Если нужны операции с папками, смотрите другие функции Bitrix (например, DeleteDirFilesEx()).

5. Заключение

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

Главные моменты, которые стоит помнить при работе с ней:

  • Не обрабатывает вложенные директории.
  • Работает только по совпадающему имени файла.
  • Позволяет настроить список исключённых файлов.
  • Лучше использовать абсолютные пути через $_SERVER["DOCUMENT_ROOT"].

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

Теги:  DeleteDirFiles, файловая система, удаление файлов

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Разработка корпоративного сайта

от 7 дней

от 40 000 рублей

Разработка сайта без системы оплаты заказов через корзину

* стоимость зависит от наличия верстки, использования готового решения и т.д.

Перенос сайтов на «1С-Битрикс»

сайты на платформе «1С-Битрикс» — это удобство, надежность и высокая посещаемость

от 12 000 рублей
Перенос сайтов с любых CMS и статичных страниц на платформу «1С-Битрикс», с учетом дизайна, верстки и урл-адресов. С сохранением всей информации и структуры сайта.

* зависит от объема выполняемых работ.

Модули и компоненты для «1С-Битрикс»

оценка производится на основе предоставленного Технического Задания

от 20 000 рублей
Разработка дополнительных модулей для 1С-Битрикс, расширение функционала, внедрение любых решений, требующихся для выполнения ваших бизнес-задач.

* стоимость зависит от конкретной задачи, ее объема и сложности выполняемых работ.