Асинхронная функция. Выполняет поиск по заданной маске файлов и каталогов, расположенных в заданном каталоге.
Синтаксис
НайтиФайлыАсинх(<Путь>, <Маска>, <ИскатьВПодкаталогах>)Полное описание, параметры и ограничения
Глобальный контекст.НайтиФайлыАсинх (Global context.FindFilesAsync)
Глобальный контекст (Global context)
НайтиФайлыАсинх (FindFilesAsync)
Доступен, начиная с версии 8.3.18.
Синтаксис:
НайтиФайлыАсинх(<Путь>, <Маска>, <ИскатьВПодкаталогах>)
Параметры:
<Путь> (обязательный)
Тип: Строка.
Путь к каталогу, в котором производится поиск. Каталог может быть как на локальной сети, так и на ftp-сервере. При использовании этой схемы в адресах необходимо указывать прямые слеши '/', а не обратные '\'.
Допускается указание полного имени файла (путь + имя).
<Маска> (необязательный)
Тип: Строка.
Маска выбора файлов.
Если параметр задан, то первый параметр воспринимается системой как путь к каталогу, в котором требуется найти файлы, удовлетворяющие маске выбора.
Для операционной системы MS Windows:
В строке маски, помимо обычных символов, допускается использование символа "*" (звездочка), обозначающего любое число произвольных символов, и "?" (знак вопроса), обозначающего один произвольный символ.
Примеры строки:
"отчет201?.docx",
"*.pdf".
Для операционных систем Linux, macOS, iOS и Android:
В строке маски допускается использование следующих последовательностей:
любой символ, допустимый в имени файла. Сопоставление указанных символов производится:
для Linux, macOS - с учетом регистра,
для iOS и Android - без учета регистра;
"*" (звездочка) - любая последовательность символов;
"?" (знак вопроса) - любой символ;
"[" - класс символов. После открывающей квадратной скобки указывается последовательность символов. Шаблон соответствует любому из указанных символов. Можно указывать диапазон, используя "-". Описание класса символов завершается "]". Для указания "-" в качестве символа класса нужно указать его первым или последним символом. Если после "[" указан знак "!", то класс описывает все символы, кроме указанных.
Пример строки:
"Все файлы|*.*|Документы|???.docx;*.[Rr][Tt][Ff];doc[0-9].txt".
<ИскатьВПодкаталогах> (необязательный)
Тип: Булево.
Истина - будет произведен обход вложенных в параметр <Путь> каталогов и поиск в них.
Параметр игнорируется, если не задан параметр <Маска>, т.к. предполагается, что ищется один файл.
Значение по умолчанию: Ложь.
Возвращаемое значение:
Тип: Обещание.
Результат выполнения обещания - массив объектов типа Файл, одержащий найденные файлы.
Описание:
Асинхронная функция. Выполняет поиск по заданной маске файлов и каталогов, расположенных в заданном каталоге.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Примечание:
Все искомые объекты должны находиться в одном каталоге.
Для работы метода на веб-клиенте необходимо предварительно подключить расширение работы с файлами.
См. также:
Глобальный контекст, метод НачатьПоискФайлов
Глобальный контекст, метод НайтиФайлы
Использование в версии:
Доступен, начиная с версии 8.3.18.
Методическая информация
Практические примеры
Пройти файловый цикл Асинх/Ждать на своих шести байтах и проверить очистку
Один контролируемый локальный опыт: новый собственный каталог, источник ABC-85, копирование, перемещение, нерекурсивный поиск, чтение реальных байтов и удаление только своих файлов.
Где и как запускать
Полный модуль управляемой формы в толстом клиенте Windows; Асинх/Ждать и небольшой собственный файловый опыт только на клиенте.
Подготовка
Создайте новую пустую конфигурацию УчебныеФайлы85 на платформе8.5.1.1343, управляемое приложение, режим совместимости Не использовать. Не используйте рабочую базу или чужие обработчики.
Оба урока выполняются именно толстым клиентом Windows с управляемым приложением. Они не предназначены для веб-клиента, мобильного клиента, сервера или фонового задания.
Обработки → ОпытФайлов85 → основная управляемая форма Форма. Для каждого урока используйте отдельную обработку либо целиком заменяйте модуль формы, не объединяйте два полных модуля.
Создайте реквизиты ПодтверждаюСвоиФайлы85 типа Булево, Занято85 типа Булево, ПутьСвоегоКаталога85 типа Строка неограниченной длины и Итог85 типа Строка неограниченной длины. Исходно оба флажка Ложь; Занято85, путь и итог показывайте только для просмотра.
Добавьте команду с именем основной процедуры урока и одноимённое действие; перетащите её на форму. Назначьте ПередЗакрытием с четырьмя параметрами из полного модуля.
Нажмите F7 и обновите только стенд. runtimeVerifiedScenarios=0: 1С здесь не запускалась; учебные каталоги, файлы, копирование и удаление не выполнялись.
Администратор заранее проверяет локальный временный каталог пользовательской учётной записи: у неё должны быть права создания/чтения/удаления, а у посторонних процессов не должно быть доступа к будущему опыту. На общей папке, сетевом пути и враждебной файловой среде пример не запускайте.
ПолучитьИмяВременногоФайла генерирует имя, но не создаёт файл. Это имя с расширением guidefiles используется как отдельный каталог опыта; существующий объект по такому имени отклоняется до операций.
Внутри собственного каталога создаётся source.txt с шестью байтами ABC-85 в UTF-8 без данных пользователя. copy.txt и moved.txt относятся только к этому же опыту; пути не берутся из полей ввода.
После собственного ручного подтверждения запустите команду и дождитесь Занято85=Ложь. Не закрывайте клиент и не изменяйте файлы извне между асинхронными этапами.
Очистка удаляет только три заранее известные собственные файловые имена. Пустой собственный каталог удаляется лишь после нерекурсивного поиска всех оставшихся объектов; неизвестные файлы/подкаталоги не удаляются.
Операции очистки небольшого локального опыта синхронные и допустимы в выбранном толстом клиенте. При отказе прав, вмешательстве другого процесса или принудительном завершении очистка не обещается: итог сообщает ошибку, а сгенерированный путь остаётся видимым для ручной проверки.
Команда и кнопка ВыполнитьСвоиФайлыАсинх85. Асинх Процедура уже объявлена; не вставляйте Ждать в обычный неасинхронный обработчик.
&НаКлиенте
Асинх Процедура ВыполнитьСвоиФайлыАсинх85(Команда)
ПроверитьСвойСтенд85();
Занято85 = Истина;
К = Неопределено;
ОшибкаОпыта = "";
Попытка
К = СоздатьСвойКонтекст85();
СозданныйКаталог = Ждать СоздатьКаталогАсинх(К.Каталог);
К.КаталогСоздан = Истина;
Если СозданныйКаталог <> К.Каталог Тогда
ВызватьИсключение "Результат создания не совпал со своим запрошенным каталогом";
КонецЕсли;
ЗаписатьСвойИсходник85(К);
Копия = Ждать КопироватьФайлАсинх(К.Исходник, К.Копия);
Если Копия <> К.Копия Тогда
ВызватьИсключение "Возвращён не свой путь копии";
КонецЕсли;
Перемещенный = Ждать ПереместитьФайлАсинх(К.Копия, К.Перемещенный);
Если Перемещенный <> К.Перемещенный Тогда
ВызватьИсключение "Возвращён не свой путь перемещения";
КонецЕсли;
ПрежняяКопия = Новый Файл(К.Копия);
Если ПрежняяКопия.Существует() Тогда
ВызватьИсключение "После перемещения copy.txt должен исчезнуть";
КонецЕсли;
Найденные = Ждать НайтиФайлыАсинх(К.Каталог, "*.txt", Ложь);
ПроверитьСвойПоиск85(Найденные, К);
ПрочитанныеБайты = Ждать СоздатьДвоичныеДанныеИзФайлаАсинх(К.Перемещенный);
Если Base64Строка(ПрочитанныеБайты) <> Base64Строка(К.ОжидаемыеБайты) Тогда
ВызватьИсключение "Байты перемещённого файла отличаются от ABC-85 в UTF-8";
КонецЕсли;
Ждать УдалитьФайлыАсинх(К.Исходник);
Ждать УдалитьФайлыАсинх(К.Перемещенный);
Исключение
ОшибкаОпыта = ОписаниеОшибки();
КонецПопытки;
ОшибкаОчистки = ОчиститьТолькоСвойОпыт85(К);
Занято85 = Ложь;
Если ОшибкаОпыта <> "" Или ОшибкаОчистки <> "" Тогда
Итог85 = ОшибкаОпыта + " " + ОшибкаОчистки;
ВызватьИсключение Итог85;
КонецЕсли;
Итог85 = "Копирование, перемещение, поиск и чтение 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 Тогда
Отказ = Истина;
ТекстПредупреждения = "Дождитесь завершения собственного файлового опыта";
КонецЕсли;
КонецПроцедурыРазбор по шагам
Проверка стенда и согласия выполняется до операций. Занято85 не допускает второго опыта; собственный контекст создаёт имена внутри одного нового каталога через реальный разделитель пути ОС.
Ждать СоздатьКаталогАсинх получает фактический строковый результат. После успеха создаётся только собственный источник из ДвоичныеДанные ABC-85.
Ждать КопироватьФайлАсинх и Ждать ПереместитьФайлАсинх выполняются последовательно; возвращённые пути проверяются. Старый copy.txt после перемещения не должен существовать.
Ждать НайтиФайлыАсинх возвращает массив Файл. Проверяются два результата, их полные имена и отсутствие каталогов вместо файлов; обход подкаталогов выключен.
Ждать СоздатьДвоичныеДанныеИзФайлаАсинх читает moved.txt. Base64Строка фактических байтов сравнивается с Base64 исходных шести байт.
Два Ждать УдалитьФайлыАсинх удаляют source.txt и moved.txt. Независимая завершающая очистка проверяет известные имена и пустоту каталога даже после ошибки основной операции.
Занято85 снимается после попытки очистки. Успех показывается только при отсутствии основной ошибки и ошибки очистки; иначе обе сохраняются в исключении.
Как проверить результат
Один опыт создаёт только собственную папку и свои файлы; пользовательские документы не используются.
После перемещения поиск обнаруживает source.txt и moved.txt, но не copy.txt.
Прочитанные байты moved.txt в точности совпадают с ABC-85 в UTF-8.
После успешного завершения собственных файлов и каталога нет; при ошибке очистки итог не содержит ложного успеха.
Ожидаемый результат
Асинхронные операции дождались завершения, содержимое подтверждено, свои файлы и пустой каталог удалены при контролируемом ручном запуске.
На что обратить внимание
Копирование допускает перезапись приёмника. Здесь приёмник появляется только в новом собственном каталоге; не заменяйте путь рабочим файлом или папкой.
Уникальное имя и Существует не являются атомарным резервированием пути. Нужен закрытый локальный учебный временный каталог без сторонних писателей и подмены файлов ссылками.
УдалитьФайлы без маски может рекурсивно удалить каталог. Файловые имена сначала проверяются на ЭтоКаталог=Ложь, а каталог опыта — на отсутствие любых дочерних объектов. Не убирайте эти проверки.
Маска *.txt и ИскатьВПодкаталогах=Ложь относятся только к своей новой папке. Поиск в КаталогДокументов, профиле пользователя или корне диска здесь не выполняется.
Проверка содержимого сравнивает реальные двоичные данные через Base64, а не размер или красивое сообщение. Для больших файлов такой подход потребует другой стратегии; здесь всего6 байт.
После перемещения старый copy.txt должен исчезнуть. Перемещение в другой том может иметь иной профиль ошибок; урок использует только одну собственную папку.
Отказ в ПередЗакрытием не защищает от принудительного завершения процесса, отключения питания или выхода без сохранения. Не выдавайте его за гарантию очистки при любых обстоятельствах.
Это учебные копирование и перемещение собственного текста, не резервное копирование рабочих данных. При подготовке справочника ни один такой файл не создавался.
Создать/копировать/переместить возвращают строковые пути, удаление возвращает Неопределено, а поиск и чтение возвращают разные типы. Не трактуйте все результаты как Булево.
Синхронная запись6 байт и завершающая очистка здесь намеренно локальные. Урок объясняет жизненный цикл, а не утверждает, что каждая операция приложения должна быть асинхронной.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.