Регулярное выражение для фильтрации файлов в OpenFileDialog - PullRequest
3 голосов
/ 29 сентября 2008

Я хотел бы знать, как фильтровать файлы в диалоге открытия файлов (в winforms) на основе регулярного выражения. Файлы имеют все одинаковые расширения (.xml). Большие файлы разделяются на несколько файлов с одинаковыми именами, которые разделяются _1 ... Мы только хотим показать файлы без _1 (первый файл данных)

диалог открытия файла имеет фильтр свойств, но я не знаю, как указать это в нашем формате имени файла, отсюда и регулярное выражение.

Thankx, Niki

Ответы [ 5 ]

3 голосов
/ 02 июня 2009

OpenFileDialogEx, описанный в этой статье CodeProject , является расширением стандартного OpenFileDialog. Основное намерение этого расширения состоит в том, чтобы изменить отображение диалогового окна, но есть несколько дополнительных наворотов. Например, OFDEx добавляет несколько событий: «Файл изменен», «Папка изменена» и т. Д.

Кто-то указал, что уведомление CDN_INCLUDEITEM, похоже, удовлетворит желание фильтровать список файлов, отображаемых в диалоговом окне. Кажется, что это так, но это не так. CDN_INCLUDEITEM не делает то, что вы думаете или хотите.

Согласно этой статье MSDN Mag ,

Если вы создаете диалог с OFN_ENABLEINCLUDENOTIFY, Windows отправляет Ваша подключаемая процедура CDN_INCLUDEITEM уведомление о каждом добавляемом элементе открытый список. Если вы вернете ЛОЖЬ, Windows исключает элемент. проблема Windows не уведомляет вас о обычные файлы, только псевдообъекты как расширения пространства имен. Когда вы прочитайте документацию через увеличительное стекло, печать совершенно ясно: «Диалоговое окно всегда включает в себя предметы, которые имеют оба SFGAO_FILESYSTEM и Атрибуты SFGAO_FILESYSANCESTOR, независимо от значения, возвращаемого CDN_INCLUDEITEM. "Видимо Redmondtonians добавил CDN_INCLUDEITEM для своих собственных целей, которые не включить фильтрацию обычных имен файлов.

Другими словами, в ответ на CDN_INCLUDEITEM вы не можете вернуть FALSE для обычных файлов, чтобы исключить их из диалогового окна. В отличие от документа, в котором говорится, что ответ от CDN_INCLUDEITEM игнорируется для обычных файлов, по моему опыту, CDN_INCLUDEITEM даже не отправляется для обычных файлов, по крайней мере, на моем компьютере с Vista.

Так возможно ли динамическое исключение файлов? Ну да, в C ++; В ответ на сообщение CDN_FOLDERCHANGED вы можете получить и установить содержимое CListCtrl, который содержит файлы. Я не понял, как установить этот список в C #.

3 голосов
/ 29 сентября 2008

Я не думаю, что вы можете сделать это с помощью свойства фильтра OpenFileDialog, которое просто фильтрует список файлов на основе расширения.

Я думаю, вам придется позволить пользователю выбрать файл XML, проверить его, а затем снова открыть диалоговое окно, если это файл _1. Вы можете подписаться на событие FileOK и слот в этой проверке там. Вы можете использовать регулярные выражения для проверки имени файла здесь. Это лучшее, что можно сделать .. Я думаю.

1 голос
/ 03 января 2009

OpenFileDialog не поддерживает это. Альтернативой является использование стороннего элемента управления, такого как FileView , который позволяет фильтровать элементы по любым критериям, например, регулярным выражениям.

0 голосов
/ 02 июня 2009

Вы должны быть в состоянии сделать это с помощью следующего фильтра: Файлы данных | * _1.xml

0 голосов
/ 03 октября 2008

Я не уверен, как это сделать в C # с WinForms, но в C ++ вы должны установить пользовательскую подключаемую процедуру и прослушать уведомление CDN_INCLUDEITEM. Затем вы проверяете каждое имя файла по своему регулярному выражению. Смотри http://msdn.microsoft.com/en-us/library/ms646960(VS.85).aspx#_win32_Filters.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...