Іздеу файлов по маске
Поиск файлов по маске — это проверка, подходит ли имя каждого файла под заданный шаблон. На экзамене важно не угадывать по внешнему виду, а последовательно сопоставлять обычные символы и метасимволы шаблона с символами имени.
Что такое маска имени файла
Сначала повторите, что такое шаблон имени файла. Маска — это шаблон, в котором часть символов задана точно, а часть обозначена специальными символами — метасимволами. Обычно проверяется всё имя файла вместе с расширением, если расширение явно включено в маску.
Маска — строка, задающая условие отбора файлов. Обычный символ маски должен совпасть с таким же символом имени, а метасимвол задаёт допустимый набор символов.
В школьных задачах используются два основных метасимвола. Звёздочка «*» заменяет любую последовательность символов, в том числе пустую последовательность. Вопросительный знак «?» заменяет ровно один любой символ.
| Обозначение | Что заменяет | Пример |
|---|---|---|
| обычный символ | только сам себя | a совпадает с a |
| ? | ровно один символ | file?.txt: file1.txt |
| * | ноль или больше символов | *.txt: все файлы с расширением .txt |
Имя файла соответствует маске тогда и только тогда, когда всю строку имени можно получить из маски заменой каждого «?» одним символом, а каждой «*» — последовательностью из нуля или более символов.
Алгоритм проверки маски
Проверяйте имя слева направо. Не пытайтесь сразу определить, что означает вся маска: особенно при нескольких звёздочках это приводит к ошибкам.
- Запишите имя файла полностью: основное имя, точку и расширение.
- Разделите маску на обычные символы и метасимволы.
- Сопоставляйте обычные символы с символами имени в тех же местах.
- Каждый «?» зачеркните вместе ровно с одним символом имени.
- Для «*» мысленно выделите столько символов, сколько нужно для совпадения оставшейся части маски. Звёздочка может не поглотить ни одного символа.
- Проверьте конец строки: после обработки маски не должно остаться лишних символов имени.
Если маска начинается с точного фрагмента, имя обязано начинаться с него. Если маска заканчивается точным фрагментом, имя обязано заканчиваться им. Например, в маске doc*.pdf расширение .pdf является обязательным, а между doc и .pdf может находиться любая последовательность символов, включая пустую.
Сначала проверьте буквенные фрагменты и расширение, а уже затем определяйте, какие символы поглощают «*» и «?». Так проще быстро отсеять неподходящие имена.
Какие имена соответствуют маске report?.txt?
Как работать со звёздочкой
Звёздочка может соответствовать любой последовательности, поэтому одно и то же имя иногда допускает несколько вариантов сопоставления. Это не мешает проверке: достаточно найти хотя бы один правильный способ сопоставить всю маску и имя.
Рассмотрим маску a*b*c. Файл abbbc подходит: первая «» может быть пустой, вторая «» — строка bb. Файл ac также подходит: обе звёздочки могут быть пустыми. Файл abbd не подходит, потому что обязательный последний символ маски — c, а имя заканчивается на d.
Если после «*» в маске есть точный фрагмент, этот фрагмент должен встретиться в имени после уже сопоставленной части. Звёздочка поглощает только те символы, которые не нужны для последующего совпадения.
Особенно внимательно проверяйте расширение. Маска *.docx подходит к report.docx и к .docx, если в используемой модели имя может быть пустым до точки. Она не подходит к report.doc и report.docx.bak. Для отбора файлов только по расширению полезно обратиться к странице отбор файлов по расширению.
Разобранный пример экзаменационного типа
Дана маска \(A??B*.txt\). Какие из имён подходят: A12B.txt, A12BC.txt, A1B.txt, A123B7.txt, AB12.txt?
В маске есть обязательная начальная буква A, затем два любых символа, затем B, произвольная последовательность символов и точное расширение .txt.
Подходят только A12B.txt и A12BC.txt. Важно: «?» потребовал ровно два символа, а «*» смог соответствовать пустой последовательности или символу C.
Маска как условие отбора
В заданиях могут просить найти количество подходящих файлов среди списка, определить возможные имена или выбрать маску для заданного набора файлов. Во всех случаях применяйте одно и то же условие: каждый файл проверяется независимо.
- Для каждого имени проверено расширение.
- Количество символов для каждого «?» посчитано точно.
- Для каждой «*» разрешена пустая последовательность.
- Все обычные символы стоят в правильном порядке.
- После сопоставления не осталось непроверенных символов имени.
Если нужно найти число файлов, удобно составить таблицу: в первой колонке имя, во второй — подходит или нет, в третьей — краткая причина. Например, причиной отказа может быть «неверное расширение», «не хватает символа для ?» или «нарушен порядок букв».
1. Считать «» одним символом. На самом деле она заменяет строку любой длины, включая пустую. 2. Разрешать «?» заменить ноль или несколько символов. Это неверно: «?» заменяет ровно один символ. 3. Проверять только основное имя и забывать расширение. 4. Считать, что символы должны совпадать только по позиции, даже если перед ними стоит «». 5. Игнорировать регистр, если условие тапсырма явно считает прописные и строчные буквы различными.
Практика на скорость и точность
Для коротких масок полезно сначала оценить минимальную длину подходящего имени. Каждый обычный символ и каждый «?» уже задают один обязательный символ; «*» длину не увеличивает, потому что может быть пустой. Например, минимальная длина маски ab?*cd равна 5: a, b, один символ для ?, c и d.
Эта оценка не заменяет полную проверку, но быстро обнаруживает невозможные варианты. Кроме длины, проверяйте порядок фиксированных фрагментов: файл достаточной длины всё равно может не подходить.
«?» — один символ; «*» — любая последовательность, включая пустую. Обычные символы совпадают буквально, а вся строка имени должна быть использована целиком.
Быстрая проверка
Главное
- Маска задаёт условие соответствия полного имени файла, обычно вместе с расширением.
- «?» заменяет ровно один символ, а «*» — ноль или больше символов.
- Проверяйте имя слева направо и не нарушайте порядок обычных символов.
- Для «*» выбирайте такую последовательность, чтобы совпала оставшаяся часть маски; пустая последовательность разрешена.
- В задачах на количество файлов проверяйте каждое имя отдельно и фиксируйте причину отказа.