Фильтровать файлы, отображаемые в OpenFileDialog, на основе содержимого?

StackOverflow https://stackoverflow.com/questions/937061

  •  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.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top