Фильтрация файлов, отображаемых в OpenFileDialog на основе содержимого? - PullRequest
7 голосов
/ 02 июня 2009

Есть ли способ изменить поведение OpenFileDialog так, чтобы он просматривал файлы в папке, в которую он открывался, а затем игнорировал некоторые из них на основе их содержимого?

Один из примеров - открыть папку, полную Zip-файлов, но показать только те, которые содержат определенный файл.

Из документации есть HookProc, но я не совсем уверен, как его использовать.

Обратите внимание, что, если это возможно, я понимаю, что это будет относительно медленная операция. На данный момент я не беспокоюсь о производительности.

Спасибо!

Ответы [ 3 ]

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

Я бы не отмахнулся от сложности OpenFileDialog. Это не так легко построить тот, который действительно работает. Когда вы создаете свой собственный, это не «нормальный» диалог, и в результате он сбивает с толку пользователей. Это правда, даже если вы делаете это хорошо, что сложно. Поэтому я бы посоветовал вам заняться расширением того, что уже есть, а не писать что-то новое.

Проверьте в этой статье для расширения OFD , которое может / может быть настроено, чтобы сделать именно то, что вы хотите. Существует обратный вызов, который вы пишете в C #, который отвечает на выбор пути.

Похожие: FolderBrowserDialogEx - аналогичное расширение для FolderBrowserDialog. Несмотря на название, вы можете настроить его для поиска файлов, а также папок. Существует обратный вызов, который вызывается, когда что-то (папка, файл) выбрано, и в этом обратном вызове вы можете делать то, что вам нужно. Например, загляните внутрь файлов в папке и заполните список файлов для отображения только этими файлами.


Другой вариант, который вы могли бы рассмотреть - это диалоговая библиотека от Ookii . Это реализация OpenFileDialog с открытым исходным кодом, и она включает в себя оболочки COM для всех новых диалоговых компонентов в Vista. Используя эту библиотеку, вы можете открыть Vista OpenFileDialog и получать события из интерфейса IFileDialogEvents в коде C #. Одним из таких событий является OnFolderChange (). Внутри обработчика вы можете вызвать IFolder.GetFolder (), который даст вам IShellItem , который даст вам папку, на которую пользователь изменяет. Следующим шагом будет детализация и потенциальная фильтрация набора файлов, и это упражнение я оставлю читателю ...

1 голос
/ 02 июня 2009

Нет, для этого вам придется реализовать свои собственные функции. Но, честно говоря, OpenFileDialog действительно не так уж много делает. Если честно, да, вы, вероятно, могли бы зацепиться за него, но вы бы потратили много работы впустую, когда настоящая работа заключается в проверке содержимого файлов, а затем вы можете написать свой собственный простой класс OpenFileDialog поверх что.

Этот вопрос может быть полезен для просмотра содержимого zip-файлов:

Как составить список содержимого папки .zip в c #?

(Обратите внимание, что вы могли бы поточить его для повышения производительности, просто не занимайте много потоков)

0 голосов
/ 02 августа 2009

Возможно, вы можете использовать Windows API Code Pack (поставляется с источником). Функция диалогов «Общие файлы» предоставляет гораздо больше функциональных возможностей диалоговых файлов, чем версии в Winforms / WPF.

http://code.msdn.microsoft.com/WindowsAPICodePack

...