Глобальный контекст.НачатьУдалениеФайлов

Методы · BeginDeletingFiles

Начинает удаление указанных файлов.

Синтаксис

НачатьУдалениеФайлов(<ОписаниеОповещения>, <Путь>, <Маска>)
Полное описание, параметры и ограничения

Глобальный контекст.НачатьУдалениеФайлов (Global context.BeginDeletingFiles)

Глобальный контекст (Global context)

НачатьУдалениеФайлов (BeginDeletingFiles)

Доступен, начиная с версии 8.3.6.

Синтаксис:
НачатьУдалениеФайлов(<ОписаниеОповещения>, <Путь>, <Маска>)
Параметры:

<ОписаниеОповещения> (обязательный)
Тип: ОписаниеОповещения.
Содержит описание процедуры, которая будет вызвана после завершения со следующим параметром:
<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения
.

<Путь> (обязательный)
Тип: Строка.
Путь к удаляемым файлам.

<Маска> (необязательный)
Маска для выбора удаляемых файлов.
Если <Маска> не указана, то удаляются все файлы и каталог <Путь>.
Для операционной системы Windows:
В строке маски, помимо обычных символов, допускается использование символа "*" (звездочка), обозначающего любое число произвольных символов, и "?" (знак вопроса), обозначающего один произвольный символ.
Для операционных систем Linux, macOS:
В строке маски допускается использование следующих последовательностей:
любой символ, допустимый в имени файла. Сопоставление указанных символов производится с учетом регистра;

"*" (звездочка) - любая последовательность символов;

"?" (знак вопроса) - любой символ;

"[" - класс символов. После открывающей квадратной скобки указывается последовательность символов. Паттерн соответствует любому из указанных символов. Можно указывать диапазон, используя "-". Описание класса символов завершается "]". Для указания "-" в качестве символа класса нужно указать его первым или последним символом. Если после "[" указан знак "!", то класс описывает все символы, кроме указанных.

Описание:

Начинает удаление указанных файлов.

Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, толстый клиент, мобильное приложение (клиент).

Примечание:
Для работы метода на веб-клиенте необходимо предварительно подключить расширение работы с файлами.
См. также:
Глобальный контекст, метод УдалитьФайлы
Глобальный контекст, метод УдалитьФайлыАсинх

Использование в версии:

Доступен, начиная с версии 8.3.6.

Описание изменено в версии 8.3.18.

Методическая информация

Практические примеры

Выполнить тот же собственный файловый цикл цепочкой Начать… и оповещений

Полная callback-цепочка с реальными результатами и типами: экспортные обработчики продолжают этапы только после завершения предыдущего, проверяют байты и завершают очистку при ошибках.

Где и как запускать

Полный клиентский модуль управляемой формы в толстом клиенте Windows; экспортные callback с точными сигнатурами и собственный контролируемый каталог.

Подготовка

  1. Создайте новую пустую конфигурацию УчебныеФайлы85 на платформе8.5.1.1343, управляемое приложение, режим совместимости Не использовать. Не используйте рабочую базу или чужие обработчики.

  2. Оба урока выполняются именно толстым клиентом Windows с управляемым приложением. Они не предназначены для веб-клиента, мобильного клиента, сервера или фонового задания.

  3. Обработки → ОпытФайлов85 → основная управляемая форма Форма. Для каждого урока используйте отдельную обработку либо целиком заменяйте модуль формы, не объединяйте два полных модуля.

  4. Создайте реквизиты ПодтверждаюСвоиФайлы85 типа Булево, Занято85 типа Булево, ПутьСвоегоКаталога85 типа Строка неограниченной длины и Итог85 типа Строка неограниченной длины. Исходно оба флажка Ложь; Занято85, путь и итог показывайте только для просмотра.

  5. Добавьте команду с именем основной процедуры урока и одноимённое действие; перетащите её на форму. Назначьте ПередЗакрытием с четырьмя параметрами из полного модуля.

  6. Нажмите F7 и обновите только стенд. runtimeVerifiedScenarios=0: 1С здесь не запускалась; учебные каталоги, файлы, копирование и удаление не выполнялись.

  7. Администратор заранее проверяет локальный временный каталог пользовательской учётной записи: у неё должны быть права создания/чтения/удаления, а у посторонних процессов не должно быть доступа к будущему опыту. На общей папке, сетевом пути и враждебной файловой среде пример не запускайте.

  8. ПолучитьИмяВременногоФайла генерирует имя, но не создаёт файл. Это имя с расширением guidefiles используется как отдельный каталог опыта; существующий объект по такому имени отклоняется до операций.

  9. Внутри собственного каталога создаётся source.txt с шестью байтами ABC-85 в UTF-8 без данных пользователя. copy.txt и moved.txt относятся только к этому же опыту; пути не берутся из полей ввода.

  10. После собственного ручного подтверждения запустите команду и дождитесь Занято85=Ложь. Не закрывайте клиент и не изменяйте файлы извне между асинхронными этапами.

  11. Очистка удаляет только три заранее известные собственные файловые имена. Пустой собственный каталог удаляется лишь после нерекурсивного поиска всех оставшихся объектов; неизвестные файлы/подкаталоги не удаляются.

  12. Операции очистки небольшого локального опыта синхронные и допустимы в выбранном толстом клиенте. При отказе прав, вмешательстве другого процесса или принудительном завершении очистка не обещается: итог сообщает ошибку, а сгенерированный путь остаётся видимым для ручной проверки.

  13. Команда и кнопка ВыполнитьСвоиФайлыОповещениями85. Все процедуры После… и ОшибкаСвоейЦепочки85 должны остаться Экспорт; их имена связаны с ОписаниеОповещения, не назначаются вручную кнопкам.

  14. Конструктор ОписаниеОповещения использует пять аргументов: успех, ЭтаФорма, собственный контекст, имя обработчика ошибки, ЭтаФорма. Не заменяйте ошибку callback-сигнатурой обычного результата.

&НаКлиенте
Процедура ВыполнитьСвоиФайлыОповещениями85(Команда)
    ПроверитьСвойСтенд85();
    Занято85 = Истина;
    К = Неопределено;
    Попытка
        К = СоздатьСвойКонтекст85();
        НачатьСозданиеКаталога(СвоеОповещение85("ПослеСозданияКаталога85", К), К.Каталог);
    Исключение
        Если К = Неопределено Тогда
            Занято85 = Ложь;
            ВызватьИсключение;
        КонецЕсли;
        К.Ошибка = ОписаниеОшибки();
        ЗавершитьСвоюЦепочку85(К);
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Функция СвоеОповещение85(Имя, К)
    Возврат Новый ОписаниеОповещения(Имя, ЭтаФорма, К, "ОшибкаСвоейЦепочки85", ЭтаФорма);
КонецФункции

&НаКлиенте
Процедура ПослеСозданияКаталога85(Каталог, К) Экспорт
    Попытка
        К.КаталогСоздан = Истина;
        Если Каталог <> К.Каталог Тогда
            ВызватьИсключение "Создан не свой запрошенный каталог";
        КонецЕсли;
        ЗаписатьСвойИсходник85(К);
        НачатьКопированиеФайла(СвоеОповещение85("ПослеКопирования85", К), К.Исходник, К.Копия);
    Исключение
        К.Ошибка = К.Ошибка + " " + ОписаниеОшибки();
        ЗавершитьСвоюЦепочку85(К);
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеКопирования85(Копия, К) Экспорт
    Попытка
        ПроверитьСвоюОбласть85(К);
        Если Копия <> К.Копия Тогда
            ВызватьИсключение "Возвращён не свой путь копии";
        КонецЕсли;
        НачатьПеремещениеФайла(СвоеОповещение85("ПослеПеремещения85", К), К.Копия, К.Перемещенный);
    Исключение
        К.Ошибка = К.Ошибка + " " + ОписаниеОшибки();
        ЗавершитьСвоюЦепочку85(К);
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеПеремещения85(Перемещенный, К) Экспорт
    Попытка
        ПроверитьСвоюОбласть85(К);
        Если Перемещенный <> К.Перемещенный Тогда
            ВызватьИсключение "Возвращён не свой путь перемещения";
        КонецЕсли;
        ПрежняяКопия = Новый Файл(К.Копия);
        Если ПрежняяКопия.Существует() Тогда
            ВызватьИсключение "copy.txt остался после перемещения";
        КонецЕсли;
        НачатьПоискФайлов(СвоеОповещение85("ПослеПоиска85", К), К.Каталог, "*.txt", Ложь);
    Исключение
        К.Ошибка = К.Ошибка + " " + ОписаниеОшибки();
        ЗавершитьСвоюЦепочку85(К);
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеПоиска85(Найденные, К) Экспорт
    Попытка
        ПроверитьСвойПоиск85(Найденные, К);
        НачатьСозданиеДвоичныхДанныхИзФайла(СвоеОповещение85("ПослеЧтенияБайтов85", К), К.Перемещенный);
    Исключение
        К.Ошибка = К.Ошибка + " " + ОписаниеОшибки();
        ЗавершитьСвоюЦепочку85(К);
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеЧтенияБайтов85(Байты, К) Экспорт
    Попытка
        ПроверитьСвоюОбласть85(К);
        Если Base64Строка(Байты) <> Base64Строка(К.ОжидаемыеБайты) Тогда
            ВызватьИсключение "Фактические байты не совпали с ABC-85 в UTF-8";
        КонецЕсли;
        НачатьУдалениеФайлов(СвоеОповещение85("ПослеУдаленияИсходника85", К), К.Исходник);
    Исключение
        К.Ошибка = К.Ошибка + " " + ОписаниеОшибки();
        ЗавершитьСвоюЦепочку85(К);
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеУдаленияИсходника85(К) Экспорт
    Попытка
        ПроверитьСвоюОбласть85(К);
        Исходник = Новый Файл(К.Исходник);
        Если Исходник.Существует() Тогда
            ВызватьИсключение "source.txt не удалён";
        КонецЕсли;
        НачатьУдалениеФайлов(СвоеОповещение85("ПослеУдаленияПеремещенного85", К), К.Перемещенный);
    Исключение
        К.Ошибка = К.Ошибка + " " + ОписаниеОшибки();
        ЗавершитьСвоюЦепочку85(К);
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеУдаленияПеремещенного85(К) Экспорт
    Попытка
        ПроверитьСвоюОбласть85(К);
        Перемещенный = Новый Файл(К.Перемещенный);
        Если Перемещенный.Существует() Тогда
            ВызватьИсключение "moved.txt не удалён";
        КонецЕсли;
        ЗавершитьСвоюЦепочку85(К);
    Исключение
        К.Ошибка = К.Ошибка + " " + ОписаниеОшибки();
        ЗавершитьСвоюЦепочку85(К);
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ОшибкаСвоейЦепочки85(ИнформацияОбОшибке, СтандартнаяОбработка, К) Экспорт
    СтандартнаяОбработка = Ложь;
    К.Ошибка = К.Ошибка + " " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
    ЗавершитьСвоюЦепочку85(К);
КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьСвоюЦепочку85(К)
    Если К.Завершено Тогда
        Возврат;
    КонецЕсли;
    К.Завершено = Истина;
    ОшибкаОчистки = ОчиститьТолькоСвойОпыт85(К);
    Занято85 = Ложь;
    Если К.Ошибка <> "" Или ОшибкаОчистки <> "" Тогда
        Итог85 = К.Ошибка + " " + ОшибкаОчистки;
    Иначе
        Итог85 = "Callback-цепочка проверила копирование, перемещение, поиск и байты ABC-85. Свои файлы и пустой каталог удалены.";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСвойСтенд85()
    Если Не ПодтверждаюСвоиФайлы85 Тогда
        ВызватьИсключение "Только собственный новый стенд УчебныеФайлы85 с согласием";
    КонецЕсли;
    Если Занято85 Тогда
        ВызватьИсключение "Дождитесь завершения текущего собственного опыта";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция СоздатьСвойКонтекст85()
    Разделитель = ПолучитьРазделительПути();
    Каталог = ПолучитьИмяВременногоФайла("guidefiles");
    ФайлКаталога = Новый Файл(Каталог);
    Если ФайлКаталога.Существует() Тогда
        ВызватьИсключение "Уникальное имя уже занято; найденный объект не считается своим";
    КонецЕсли;
    К = Новый Структура;
    К.Вставить("Каталог", Каталог);
    К.Вставить("Разделитель", Разделитель);
    К.Вставить("КаталогСоздан", Ложь);
    К.Вставить("Исходник", Каталог + Разделитель + "source.txt");
    К.Вставить("Копия", Каталог + Разделитель + "copy.txt");
    К.Вставить("Перемещенный", Каталог + Разделитель + "moved.txt");
    К.Вставить("ОжидаемыеБайты", ПолучитьДвоичныеДанныеИзСтроки("ABC-85", КодировкаТекста.UTF8));
    К.Вставить("Ошибка", "");
    К.Вставить("Завершено", Ложь);
    ПутьСвоегоКаталога85 = Каталог;
    Возврат К;
КонецФункции

&НаКлиенте
Процедура ПроверитьСвоюОбласть85(К)
    Если К.Каталог <> ПутьСвоегоКаталога85 Или Прав(К.Каталог, 11) <> ".guidefiles" Тогда
        ВызватьИсключение "Не совпал собственный сгенерированный каталог этого опыта";
    КонецЕсли;
    Если К.Исходник <> К.Каталог + К.Разделитель + "source.txt"
        Или К.Копия <> К.Каталог + К.Разделитель + "copy.txt"
        Или К.Перемещенный <> К.Каталог + К.Разделитель + "moved.txt" Тогда
        ВызватьИсключение "Изменились границы собственной файловой области";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗаписатьСвойИсходник85(К)
    ПроверитьСвоюОбласть85(К);
    ФайлКаталога = Новый Файл(К.Каталог);
    Если Не К.КаталогСоздан Или Не ФайлКаталога.Существует() Или Не ФайлКаталога.ЭтоКаталог() Тогда
        ВызватьИсключение "Создание своего каталога ещё не подтверждено";
    КонецЕсли;
    ФайлИсходника = Новый Файл(К.Исходник);
    Если ФайлИсходника.Существует() Тогда
        ВызватьИсключение "Свой источник не должен перезаписывать существующий файл";
    КонецЕсли;
    К.ОжидаемыеБайты.Записать(К.Исходник);
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСвойПоиск85(Найденные, К)
    ПроверитьСвоюОбласть85(К);
    Если ТипЗнч(Найденные) <> Тип("Массив") Или Найденные.Количество() <> 2 Тогда
        ВызватьИсключение "После перемещения нужны два реальных собственных txt-файла";
    КонецЕсли;
    Для Каждого Найденный Из Найденные Цикл
        Если Найденный.ПолноеИмя <> К.Исходник И Найденный.ПолноеИмя <> К.Перемещенный Тогда
            ВызватьИсключение "Поиск вернул неожиданный объект; не удаляйте его";
        КонецЕсли;
        Если Найденный.ЭтоКаталог() Тогда
            ВызватьИсключение "Вместо собственного txt-файла найден каталог";
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

&НаКлиенте
Функция ОчиститьТолькоСвойОпыт85(К)
    Если К = Неопределено Тогда
        Возврат "";
    КонецЕсли;
    ОшибкаОчистки = "";
    Попытка
        ПроверитьСвоюОбласть85(К);
    Исключение
        Возврат "Границы опыта не подтвердились; очистка не начата: " + ОписаниеОшибки();
    КонецПопытки;
    Если Не К.КаталогСоздан Тогда
        Возврат "Создание каталога не подтвердилось; автоматическая очистка не выполнялась";
    КонецЕсли;
    Имена = Новый Массив;
    Имена.Добавить(К.Исходник);
    Имена.Добавить(К.Копия);
    Имена.Добавить(К.Перемещенный);
    Для Каждого Имя Из Имена Цикл
        Попытка
            СвойФайл = Новый Файл(Имя);
            Если СвойФайл.Существует() Тогда
                Если СвойФайл.ЭтоКаталог() Тогда
                    ВызватьИсключение "На месте своего файла обнаружен каталог; его не удаляем";
                КонецЕсли;
                УдалитьФайлы(Имя);
            КонецЕсли;
            Если СвойФайл.Существует() Тогда
                ВызватьИсключение "Свой файл остался после удаления";
            КонецЕсли;
        Исключение
            ОшибкаОчистки = ОшибкаОчистки + " " + ОписаниеОшибки();
        КонецПопытки;
    КонецЦикла;
    Попытка
        СвойКаталог = Новый Файл(К.Каталог);
        Если СвойКаталог.Существует() Тогда
            Остаток = НайтиФайлы(К.Каталог, "*", Ложь);
            Если Остаток.Количество() <> 0 Тогда
                ВызватьИсключение "Каталог не пуст; неизвестные объекты не удаляем";
            КонецЕсли;
            УдалитьФайлы(К.Каталог);
        КонецЕсли;
        Если СвойКаталог.Существует() Тогда
            ВызватьИсключение "Свой пустой каталог остался после удаления";
        КонецЕсли;
    Исключение
        ОшибкаОчистки = ОшибкаОчистки + " " + ОписаниеОшибки();
    КонецПопытки;
    Возврат ОшибкаОчистки;
КонецФункции

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
    Если Занято85 Тогда
        Отказ = Истина;
        ТекстПредупреждения = "Дождитесь завершения собственного файлового опыта";
    КонецЕсли;
КонецПроцедуры

Разбор по шагам

  1. Создаётся тот же собственный контекст. НачатьСозданиеКаталога сразу возвращает управление; продолжение выполняется в ПослеСозданияКаталога85 после реального результата.

  2. Создание, копирование и перемещение передают в свои обработчики путь и контекст. Проверка пути идёт до следующего этапа; в любой процедуре обработаны ошибки собственного проверочного кода.

  3. НачатьПоискФайлов передаёт массив Файл и контекст. ПослеПоиска85 проверяет два своих результата и только затем начинает чтение moved.txt.

  4. НачатьСозданиеДвоичныхДанныхИзФайла передаёт ДвоичныеДанные и контекст. Сравнение Base64 подтверждает фактическое содержимое до удаления файлов.

  5. НачатьУдалениеФайлов вызывает обработчик только с контекстом, без выдуманного результата Булево. После каждого удаления отдельно проверяется отсутствие своего файла.

  6. ОшибкаСвоейЦепочки85 получает ИнформацияОбОшибке, СтандартнаяОбработка и контекст — три аргумента по установленной справке. Стандартный показ отключается только потому, что собственный итог сохраняет ошибку и результат очистки.

  7. ЗавершитьСвоюЦепочку85 допускается один раз. Оно выполняет контролируемую синхронную очистку собственных остатков, снимает Занято85 и сообщает успех лишь при отсутствии всех ошибок.

Как проверить результат

  1. Двойной запуск во время цепочки отклоняется флагом Занято85.

  2. Поиск и байты дают те же результаты, что в варианте Асинх/Ждать; порядок этапов не нарушается.

  3. Обработчики удаления имеют один параметр К, ошибки — три. Каждый обработчик успеха защищён собственной Попытка для ошибок проверок.

  4. После успеха каталог отсутствует. При ошибке отображаются исходная причина и результат очистки, а флаг занятости снимается.

Ожидаемый результат

Callback-цепочка завершает все этапы на реальных собственных файлах и сообщает подтверждённую очистку либо явную ошибку.

На что обратить внимание

  1. Копирование допускает перезапись приёмника. Здесь приёмник появляется только в новом собственном каталоге; не заменяйте путь рабочим файлом или папкой.

  2. Уникальное имя и Существует не являются атомарным резервированием пути. Нужен закрытый локальный учебный временный каталог без сторонних писателей и подмены файлов ссылками.

  3. УдалитьФайлы без маски может рекурсивно удалить каталог. Файловые имена сначала проверяются на ЭтоКаталог=Ложь, а каталог опыта — на отсутствие любых дочерних объектов. Не убирайте эти проверки.

  4. Маска *.txt и ИскатьВПодкаталогах=Ложь относятся только к своей новой папке. Поиск в КаталогДокументов, профиле пользователя или корне диска здесь не выполняется.

  5. Проверка содержимого сравнивает реальные двоичные данные через Base64, а не размер или красивое сообщение. Для больших файлов такой подход потребует другой стратегии; здесь всего6 байт.

  6. После перемещения старый copy.txt должен исчезнуть. Перемещение в другой том может иметь иной профиль ошибок; урок использует только одну собственную папку.

  7. Отказ в ПередЗакрытием не защищает от принудительного завершения процесса, отключения питания или выхода без сохранения. Не выдавайте его за гарантию очистки при любых обстоятельствах.

  8. Это учебные копирование и перемещение собственного текста, не резервное копирование рабочих данных. При подготовке справочника ни один такой файл не создавался.

  9. Не запускайте копирование или чтение сразу после Начать… в той же процедуре: завершение ещё не произошло. Здесь каждый этап начинается только из нужного callback.

  10. Ошибка собственного кода внутри callback не должна оставлять форму навечно занятой. Поэтому проверочные исключения каждой процедуры тоже идут в ЗавершитьСвоюЦепочку85.

  11. Для удаления передаётся только ДополнительныеПараметры; для ошибки — ИнформацияОбОшибке, СтандартнаяОбработка, ДополнительныеПараметры. Универсальная двухпараметровая сигнатура здесь неверна.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.