Фильтровать файлы, отображаемые в OpenFileDialog, на основе содержимого?
-
06-09-2019 - |
Вопрос
Есть ли способ изменить поведение OpenFileDialog так, чтобы он просматривал файлы в папке, в которую он открывается, а затем игнорировал определенные из них на основе их содержимого?
Одним из примеров может быть открытие папки, полной Zip-файлов, но показываются только те, которые содержат определенный файл.
Из документации следует, что есть HookProc, но я не совсем уверен, как бы я его использовал.
Пожалуйста, обратите внимание, что, если это возможно, я понимаю, что это будет относительно медленная операция.На данный момент я не беспокоюсь о производительности.
Спасибо!
Решение
Я бы не стал сбрасывать со счетов сложность OpenFileDialog.Не так-то просто создать что-то действительно работающее.Когда вы создаете свой собственный, это не "обычный" диалог, и в результате он сбивает пользователей с толку.Это верно, даже если вы делаете это хорошо, что непросто.Поэтому я бы посоветовал вам продолжать расширять то, что уже есть, а не писать что-то новое.
Проверить эта статья о расширении OFD это может быть изменено, чтобы делать именно то, что вы хотите.Есть обратный вызов, который вы пишете на C #, который реагирует на выбор пути.
Похожие: Folderbrowserдиалогекс это аналогичное расширение для FolderBrowserDialog.Несмотря на название, вы можете настроить его для поиска файлов, а также папок.Существует обратный вызов, который вызывается при выборе чего-либо (папки, файла), и в рамках этого обратного вызова вы можете делать то, что вам нужно.Например, загляните внутрь файлов в папке и заполните список файлов для отображения только этими файлами.
Другой вариант, который вы могли бы рассмотреть, - это библиотека диалогов из Ookii.Это реализация OpenFileDialog с открытым исходным кодом, и она включает COM-оболочки для всех новых диалоговых элементов в Vista.Используя эту библиотеку, вы можете открыть Vista OpenFileDialog и получать события из IFileDialogEvents ( Если есть ) события интерфейс, написанный в коде C#.Одним из таких событий является OnFolderChange().Внутри обработчика вы могли бы вызвать iFolder .GetFolder(), который выдаст вам Ишеллитем, который выдает вам папку, в которую переходит пользователь.Следующим шагом будет детализация и, возможно, фильтрация набора файлов, это упражнение я оставлю читателю...
Другие советы
Нет, для этого вам пришлось бы реализовать свою собственную функциональность.Но, честно говоря, OpenFileDialog на самом деле мало что делает.Честно говоря, да, вы, вероятно, могли бы подключиться к этому, но вы бы проделали большую работу впустую, когда реальная работа заключается в проверке содержимого файлов, а затем вы можете написать свой собственный простой класс OpenFileDialog поверх этого.
Возможно, этот вопрос покажется вам полезным при перечислении содержимого zip-файлов:
Как перечислить содержимое папки .zip на c #?
(Обратите внимание, вы потенциально могли бы использовать его для повышения производительности, просто не охватывайте много потоков)
Вероятно, вы можете использовать пакет кода Windows API (поставляется вместе с исходным кодом).Функция общих файловых диалогов предоставляет гораздо больше функциональных возможностей файловых диалогов, чем версии в Winforms / WPF.