Определить, какие из заданных имен файлов соответствуют системной маске
Обновлено: 21.11.2024
Если вы когда-либо использовали сценарий оболочки, вы, скорее всего, применяли сопоставление с образцом для поиска файлов. На самом деле, вы, вероятно, использовали его экстенсивно. Если вы его не использовали, сопоставление шаблонов использует специальные символы для создания шаблона, а затем имена файлов можно сравнивать с этим шаблоном. Например, в большинстве сценариев оболочки звездочка * соответствует любому количеству символов. Например, следующая команда выводит список всех файлов в текущем каталоге, которые заканчиваются на .html :
Пакет java.nio.file обеспечивает программную поддержку этой полезной функции. Каждая реализация файловой системы предоставляет PathMatcher . Вы можете получить PathMatcher файловой системы, используя метод getPathMatcher(String) в классе FileSystem. Следующий фрагмент кода извлекает сопоставление пути для файловой системы по умолчанию:
Строковый аргумент, передаваемый в getPathMatcher, указывает разновидность синтаксиса и шаблон для сопоставления. В этом примере задается синтаксис glob. Если вы не знакомы с синтаксисом glob, см. раздел Что такое Glob.
Глобальный синтаксис прост в использовании и гибок, но при желании вы также можете использовать синтаксис регулярных выражений или регулярных выражений. Дополнительные сведения о регулярных выражениях см. в уроке «Регулярные выражения». Некоторые реализации файловой системы могут поддерживать другой синтаксис.
Если вы хотите использовать другую форму сопоставления шаблонов на основе строк, вы можете создать свой собственный класс PathMatcher. В примерах на этой странице используется синтаксис glob.
После того как вы создали экземпляр PathMatcher, вы готовы сопоставлять с ним файлы. В интерфейсе PathMatcher есть единственный метод, matches , который принимает аргумент Path и возвращает логическое значение: он либо соответствует шаблону, либо нет. Следующий фрагмент кода ищет файлы, оканчивающиеся на .java или .class, и выводит эти файлы на стандартный вывод:
Рекурсивное сопоставление с образцом
Поиск файлов, соответствующих определенному шаблону, неразрывно связан с просмотром дерева файлов. Сколько раз вы знаете, что файл находится где-то в файловой системе, но где? Или, возможно, вам нужно найти в дереве файлов все файлы с определенным расширением.
Пример Find делает именно это. Find похожа на утилиту поиска UNIX, но функционально урезана. Вы можете расширить этот пример, включив в него другие функции. Например, утилита find поддерживает флаг -prune для исключения из поиска всего поддерева. Вы можете реализовать эту функциональность, возвращая SKIP_SUBTREE в методе preVisitDirectory. Чтобы реализовать параметр -L, который переходит по символическим ссылкам, вы можете использовать метод walkFileTree с четырьмя аргументами и передать перечисление FOLLOW_LINKS (но убедитесь, что вы проверяете циклические ссылки в методе visitFile).
Для запуска приложения "Найти" используйте следующий формат:
Шаблон помещается в кавычки, поэтому любые подстановочные знаки не интерпретируются оболочкой. Например:
Мне нужно решить, соответствует ли имя файла маске файла. Маска файла может содержать * или ? персонажи. Есть ли какое-нибудь простое решение для этого?
13 ответов 13
Я ценю, что нашел ответ Джоэла, он также сэкономил мне время! Однако мне пришлось внести несколько изменений, чтобы метод работал так, как ожидало большинство пользователей:
- Я удалил ключевое слово this перед первым аргументом. Здесь он ничего не делает (хотя может быть полезен, если метод предназначен для использования в качестве метода расширения, и в этом случае он должен быть общедоступным и содержаться в статическом классе, а сам должен быть статическим методом).
- Я сделал регулярное выражение независимым от регистра, чтобы оно соответствовало стандартному поведению подстановочных знаков Windows (например, "c*.*" и "C*.*" возвращают один и тот же результат).
- Я добавил начальную и конечную привязки к регулярному выражению, опять же, чтобы соответствовать стандартному поведению подстановочных знаков Windows (например, "stuff.txt" будет соответствовать "stuff*", "s*" или "s*.*", но а не просто "s").
Обновление 2009.11.04: соответствие одной из нескольких масок
Для еще большей гибкости здесь используется плагин-совместимый метод, созданный поверх оригинала. Эта версия позволяет передавать несколько масок (отсюда множественное число во втором имени параметра fileMasks), разделенных линиями, запятыми, вертикальными чертами или пробелами. Я хотел, чтобы пользователь мог поместить в ListBox столько вариантов, сколько пожелает, а затем выбрать все файлы, соответствующие любому из них. Обратите внимание, что некоторые элементы управления (например, ListBox) используют CR-LF для разрывов строк, в то время как другие (например, RichTextBox) используют только LF, поэтому и "\r\n", и "\n" отображаются в списке разделения.< /p>
Обновление 2009.11.17: более изящная обработка входных данных fileMask
Предыдущая версия FitsMask (которую я оставил для сравнения) неплохо справляется со своей задачей, но, поскольку мы рассматриваем ее как регулярное выражение, она выдаст исключение, если она не является допустимым регулярным выражением.Решение состоит в том, что мы действительно хотим, чтобы любые метасимволы регулярных выражений во входном файлеMask считались литералами, а не метасимволами. Но нам все еще нужно специально обрабатывать точку, звездочку и вопросительный знак. Таким образом, эта улучшенная версия FitsMask безопасно убирает эти три символа, преобразует все оставшиеся метасимволы в литералы, а затем возвращает три интересных символа обратно в их "регулярно выраженную" форму.
Еще одно незначительное улучшение – возможность независимости от регистра в соответствии со стандартным поведением Windows.
Обновление 30.09.2010: где-то по пути возникла страсть.
Я небрежно не обновил это ранее, но эти ссылки, вероятно, будут интересны читателям, которые дошли до этого места:
Во время поиска повторяющихся файлов имя каждого файла проверяется и сравнивается с настройками, заданными в разделе «Имена файлов» на закрепляемой панели «Фильтрация поиска».
Маски имен файлов могут быть как включающими, так и исключающими (подробности см. ниже).
Маски имен файлов могут быть определены с использованием одного из двух синтаксисов: шаблонов подстановочных знаков (по умолчанию) или более сложных регулярных выражений. Используйте переключатель "Использовать сопоставление с регулярным выражением" в разделе масок имен файлов на панели фильтрации поиска, чтобы переключаться между этими двумя режимами.
Шаблоны подстановочных знаков (включая и исключая)
При работе в режиме шаблона подстановочных знаков маски имен файлов состоят из шаблонов символов с несколькими наборами масок, разделенных точкой с запятой. Подстановочные знаки включают '?' и '*', которые соответствуют либо одному экземпляру, либо нескольким экземплярам любого символа (соответственно). Любой другой символ (не подстановочный знак) соответствует самому себе.
Кроме того, любой маске имени файла может предшествовать символ тильды ('~'), который указывает, что маска является исключающей. Если имя файла соответствует исключающей маске, файл всегда будет пропущен.
Вы также можете использовать переключатель "Сравнить полный путь", чтобы сравнить весь путь файловой системы (а не только имя файла) с заданным фильтром.
Примеры подстановочных знаков
Вот несколько примеров масок имен файлов с подстановочными знаками:
• mypicture.bmp — в этой маске нет подстановочных знаков, поэтому она соответствует буквальному. В процесс сравнения дубликатов будут включены только файлы с именем "mypicture.bmp".
• *.bmp — эта маска использует символ звездочки ('*') для включения любых файлов с расширением ".bmp" в именах.
• *.bmp;*gif;*jpg — это составная маска с отдельными элементами, разделенными точкой с запятой. Эта маска будет соответствовать любым файлам ".bmp", ".jpg" или ".jpg", которые она встретит.
• ~family*;*.bmp — первому элементу этой составной маски предшествует тильда ('~'), что означает, что будут исключены все файлы, имена которых начинаются с "family". Затем он будет включать все файлы с расширением ".bmp" в своих именах.
В разделе имен файлов на панели закрепления «Фильтрация поиска» также есть кнопка «Предустановки», которую можно нажать для быстрого доступа к ряду встроенных масок (называемых «Группы файлов»). Они помогут вам быстро приступить к работе, а также могут быть настроены в соответствии с вашими потребностями.
Важное примечание. При использовании подстановочных знаков в масках имен файлов имейте в виду, что маска '*.*' немного отличается от простой '*'. Первый требует наличия точки (.) в имени файла, а второй — нет. Другими словами, шаблон *.* не будет соответствовать именам файлов без расширения. Если вы хотите сопоставить их, используйте вместо этого только одну звездочку (*).
Как отмечалось выше, маски имен файлов также можно определять с помощью мощного синтаксиса регулярных выражений. Регулярные выражения — это формулы, которые можно использовать для сопоставления строк текста, следующих некоторому шаблону. Они позволяют своим пользователям кратко выражать набор правил сопоставления символов, которые в противном случае потребовали бы большого количества переключателей и логических операций.
Duplicate File Detective использует механизм регулярных выражений, совместимый с ECMAScript, и связанный с ним синтаксис.
В этом справочном файле не содержится подробного руководства по формированию регулярных выражений, поскольку в Интернете имеется большое количество таких руководств (зайдите в свою любимую поисковую систему и введите "регулярные выражения" или "регулярные выражения ECMAScript"). синтаксис выражения" в поле поиска, чтобы найти их).
Примеры регулярных выражений:
• .* — соответствует всему (например, любому имени файла).
• .*(back).* — соответствует любому имени файла, содержащему слово "back"
• ^(. *settings).* — соответствует любому имени файла, НЕ содержащему слова «settings».
• ^(. *settings)(.*wonder).* — соответствует любому имени файла, содержащему слово «wonder», но НЕ содержащему слово «settings».
• ^front.* — соответствует любому имени файла, начинающемуся со слова «front».
• .*\d.* — Соответствует именам файлов, содержащим четырехзначное число.
Исключение защищенных типов файлов
По умолчанию Duplicate File Detective исключает защищенные типы файлов из процесса поиска дубликатов. Для управления защищенными типами файлов перейдите на вкладку «Защита» в окне «Настройки».
Маски файлов и подстановочные знаки поддерживаются в любых параметрах действий или триггеров, которые указывают имена папок или файлов, обычно это действия файловой системы, сжатия, шифрования и FTP. Маска файла, по сути, представляет собой набор фиксированных и подстановочных знаков, используемых для сопоставления имен папок и файлов. Они предоставляют гибкие средства для идентификации определенного файла или группы файлов на основе их имени и расширения. Подстановочный знак можно использовать для замены любого другого символа или символов в строке. Используя маски и подстановочные знаки, вы можете легко указать, какие файлы и/или папки следует обрабатывать, а какие следует игнорировать.
Маски файлов могут состоять из любой комбинации следующего:
Фиксированные символы — буквы, цифры и другие символы, разрешенные в именах файлов.
Вопросительный знак (?) – обозначает любой отдельный символ.
Звездочка (*) — обозначает любую последовательность символов (включая отсутствие символов).
Хотя четко определено, что маска файла, содержащая только фиксированные символы, однозначно идентифицирует файл (например, маска файла myFile.txt относится только к текстовому файлу с именем myFile.txt ), маска файла, содержащая символы подстановки? и/или * может относиться к одному или нескольким файлам.
Несколько файлов маски
В большинстве случаев можно указать несколько файлов или объединить несколько масок подстановочных знаков, разделив каждую вертикальной чертой (|). Например, следующая маска включает все изображения JPG и GIF, содержащиеся в c:\temp\:
Подстановочные знаки позволяют маске файла соответствовать нескольким именам папок или файлов. В таблице ниже приведены различные примеры масок файлов.
Соответствует всем файлам, содержащим любое количество символов, с расширениями или без них (например, ввод A* соответствует любому файлу или папке, начинающейся с буквы A, за которой следует любое количество символов).
Соответствует всем файлам, содержащим любое количество символов и с любым расширением. Соответствует даже файлам без расширения (например, ввод A*.* соответствует любому файлу, начинающемуся с буквы A, за которой следует любое количество символов вместе с любым расширением).
Соответствует любому одиночному символу (например, ввод A? соответствует любому файлу, начинающемуся с буквы A, за которой следует любой одиночный символ).
Соответствует всем файлам, имена которых содержат любое количество символов с расширением .jpg (например, image_name.jpg, cool_pic.jpg, 1.jpg).
Соответствует всем файлам, имена которых содержат любое количество символов с расширением, начинающимся с буквы p (например, document.pdf, image_name.jpg, business.project, 1.ppt )
Соответствует всем файлам, имена которых начинаются с pic (например, picture_name.jpg, pictogram.ico, picker.html, pic ).
Соответствует всем файлам .html с именами, начинающимися с любой последовательности символов, за которыми следует строка mat и заканчивающаяся одним символом (например,automate.html, mate.html, tomato.html).
Соответствует всем файлам с именами, содержащими шесть символов и без расширения (например, 123456, myFile, my_pic, images)
Соответствует всем файлам .pdf, имена которых начинаются с doc, за которым следуют любые пять символов (например, document.pdf, доктрина.pdf, doc_1234.pdf).
Соответствует определенным именам файлов или маскам подстановочных знаков, которые находятся в том же каталоге (например, c:\temp\file1.txt|file2.jpg|file3.jpg).
Соответствует определенным именам файлов или маскам с подстановочными знаками, которые находятся в разных каталогах (например, c:\photos\*.jpg|\c:\music\*.mp3).
(Если указатель и содержание скрыты, щелкните значок в левом верхнем углу.)
Некоторая информация относится к предварительной версии продукта, которая может быть существенно изменена до ее выпуска. Microsoft не дает никаких явных или подразумеваемых гарантий в отношении представленной здесь информации.
Возвращает имена файлов, соответствующих заданным критериям.
Перегрузки
Возвращает имена файлов (включая их пути) в указанном каталоге.
Возвращает имена файлов (включая их пути), которые соответствуют указанному шаблону поиска в указанном каталоге.
Возвращает имена файлов (включая их пути), которые соответствуют указанному шаблону поиска и параметрам перечисления в указанном каталоге.
Возвращает имена файлов (включая их пути), которые соответствуют указанному шаблону поиска в указанном каталоге, используя значение для определения необходимости поиска в подкаталогах.
Получить файлы(строка)
Возвращает имена файлов (включая их пути) в указанном каталоге.
Параметры
Относительный или абсолютный путь к каталогу для поиска. В этой строке не учитывается регистр.
Возврат
Массив полных имен (включая пути) файлов в указанном каталоге или пустой массив, если файлы не найдены.
Исключения
путь — это имя файла.
Произошла ошибка сети.
У вызывающего абонента нет необходимого разрешения.
Указанный путь, имя файла или оба параметра превышают максимальную длину, определенную системой.
Указанный путь не найден или недействителен (например, он находится на несопоставленном диске).
Примеры
В следующем примере показано, как использовать метод GetFiles для возврата имен файлов из указанного пользователем местоположения. Пример настроен так, чтобы перехватывать все ошибки, характерные для этого метода.
Примечания
Методы EnumerateFiles и GetFiles различаются следующим образом: при использовании EnumerateFiles можно начать перечисление коллекции имен до того, как будет возвращена вся коллекция; когда вы используете GetFiles, вы должны дождаться возврата всего массива имен, прежде чем вы сможете получить доступ к массиву. Поэтому, когда вы работаете с большим количеством файлов и каталогов, EnumerateFiles может быть более эффективным.
Имена возвращаемых файлов добавляются к указанному параметру пути.
Этот метод идентичен GetFiles(String, String) со звездочкой (*), указанной в качестве шаблона поиска.
Параметр пути может указывать относительный или абсолютный путь. Информация об относительном пути интерпретируется как относительная к текущему рабочему каталогу. Чтобы получить текущий рабочий каталог, см. GetCurrentDirectory.
Порядок возвращаемых имен файлов не гарантируется; используйте метод Sort, если требуется определенный порядок сортировки.
Параметр пути не чувствителен к регистру.
Список общих задач ввода-вывода см. в разделе Общие задачи ввода-вывода.
См. также
Относится к
Получить файлы(строка, строка)
Возвращает имена файлов (включая их пути), которые соответствуют указанному шаблону поиска в указанном каталоге.
Параметры
Относительный или абсолютный путь к каталогу для поиска. В этой строке не учитывается регистр.
Строка поиска для сопоставления с именами файлов в пути . Этот параметр может содержать комбинацию допустимого прямого пути и подстановочных знаков (* и ?), но не поддерживает регулярные выражения.
Возврат
Массив полных имен (включая пути) файлов в указанном каталоге, соответствующих заданному шаблону поиска, или пустой массив, если файлы не найдены.
Исключения
путь — это имя файла.
Произошла ошибка сети.
У вызывающего абонента нет необходимого разрешения.
searchPattern не содержит допустимого шаблона.
path или searchPattern имеет значение null .
Указанный путь, имя файла или оба параметра превышают максимальную длину, определенную системой.
Указанный путь не найден или недействителен (например, он находится на несопоставленном диске).
Примеры
В следующем примере подсчитывается количество файлов, начинающихся с указанной буквы.
Примечания
Возвращаемые имена файлов добавляются к указанному параметру пути, и порядок возвращаемых имен файлов не гарантируется; используйте метод Sort, если требуется определенный порядок сортировки.
searchPattern может быть комбинацией буквенных и подстановочных знаков, но не поддерживает регулярные выражения. В searchPattern разрешены следующие подстановочные знаки.
Подстановочный знак | Соответствия |
---|---|
* (звездочка) | Ноль или более символов в этой позиции. |
? (вопросительный знак) | Ноль или один символ в этой позиции. |
Символы, кроме подстановочных знаков, являются буквальными символами. Например, строка searchPattern "*t" ищет все имена в пути, оканчивающемся на букву "t". Строка searchPattern "s*" ищет все имена в пути, начинающемся с буквы "s".
SearchPattern не может заканчиваться двумя точками ("..") или содержать две точки (".."), за которыми следует DirectorySeparatorChar или AltDirectorySeparatorChar, а также не может содержать недопустимых символов. Вы можете запросить недопустимые символы с помощью метода GetInvalidPathChars.
При использовании подстановочного знака звездочки в шаблоне поиска, таком как "*.txt", количество символов в указанном расширении влияет на поиск следующим образом:
- Если указанное расширение состоит ровно из трех символов, метод возвращает файлы с расширениями, начинающимися с указанного расширения. Например, "*.xls" возвращает как "book.xls", так и "book.xlsx".
- Во всех остальных случаях метод возвращает файлы, точно соответствующие указанному расширению. Например, "*.ai" возвращает "file.ai", но не "file.aif".
При использовании подстановочного знака вопросительного знака этот метод возвращает только файлы, соответствующие указанному расширению файла. Например, для двух файлов, "file1.txt" и "file1.txtother", в каталоге, шаблон поиска "file?.txt" возвращает только первый файл, тогда как шаблон поиска "file*.txt" возвращает оба файла.
Поскольку этот метод проверяет имена файлов как в формате имени файла 8.3, так и в формате длинного имени файла, шаблон поиска, аналогичный "*1*.txt", может возвращать неожиданные имена файлов. Например, при использовании шаблона поиска "*1*.txt" возвращается "longfilename.txt", поскольку эквивалентным форматом имени файла версии 8.3 является "LONGFI~1.TXT".
Методы EnumerateFiles и GetFiles различаются следующим образом: при использовании EnumerateFiles можно начать перечисление коллекции имен до того, как будет возвращена вся коллекция; когда вы используете GetFiles, вы должны дождаться возврата всего массива имен, прежде чем вы сможете получить доступ к массиву. Поэтому, когда вы работаете с большим количеством файлов и каталогов, EnumerateFiles может быть более эффективным.
Параметр пути может указывать относительный или абсолютный путь. Информация об относительном пути интерпретируется как относительная к текущему рабочему каталогу. Чтобы получить текущий рабочий каталог, см. GetCurrentDirectory.
Читайте также: