Передача одиночных файлов средствами объекта FTPСоединение является стандартной задачей, однако работа с целыми каталогами требует более сложного подхода. Рассмотрим по шагам, как реализовать механизм массовой загрузки или выгрузки данных, соблюдая структуру вложенных директорий.
Когда нам необходимо передать не один файл, а целую папку, мы сталкиваемся с тем, что встроенный объект FTPСоединение не поддерживает рекурсивную передачу «одной командой». Поэтому нам предстоит разбить задачу на логические блоки:
Для начала работы с файловой системой нам потребуется функция НайтиФайлы. Она позволяет получить массив объектов Файл, которые содержат всю необходимую информацию: имя, путь, размер и признак того, является ли объект каталогом.
Пример использования функции для получения данных:
// Получаем список всех элементов в указанной папке
МассивФайлов = НайтиФайлы("D:/МояПапка/", "*.*");
Для Каждого Элемент Из МассивФайлов Цикл
Если Элемент.ЭтоКаталог() Тогда
// Обработка вложенной папки
Иначе
// Отправка файла
КонецЕсли;
КонецЦикла;
Самым важным аспектом при передаче каталога является сохранение иерархии. Если мы попытаемся отправить файл в папку, которой еще нет на FTP, FTPСоединение вернет ошибку. Поэтому перед вызовом метода Записать необходимо проверить существование удаленного каталога.
Рекомендуем создать вспомогательную процедуру, которая будет вызывать сама себя (рекурсия) при обнаружении вложенных папок. Внутри этой процедуры используйте метод СоздатьКаталог объекта FTPСоединение.
Массовая передача данных подвержена сетевым сбоям. Чтобы ваш алгоритм не «падал» при первой ошибке, придерживайтесь следующих правил:
Попытка...Исключение внутри цикла для каждого отдельного файла. Это позволит продолжить работу программы, если один из файлов оказался заблокирован или поврежден.Записать объекта ЗаписьZipФайла) с последующей отправкой — это самый надежный способ избежать проблем с путями и сетевыми задержками.Поскольку пофайловая передача через FTPСоединение может быть медленной из-за большого количества сетевых запросов (для каждого файла отправляется отдельный запрос), профессионалы часто используют промежуточный этап:
Разберем логику:
Zip.КоманднаяСтрока или другие скрипты).Этот метод значительно экономит время выполнения операции и упрощает поддержку кода, так как вам не нужно вручную отслеживать создание каждой вложенной папки и проверять, успешно ли прошла запись каждого мелкого файла.
Таким образом, для решения задачи вы можете выбрать либо написание рекурсивного обхода дерева файлов с использованием НайтиФайлы, либо стратегию предварительной архивации. Выбор зависит от специфики ваших задач и количества файлов в каталоге.