Синхронизация библиотек Windows 7

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

До Windows 7 и появления библиотек вы хранили ваши музыкальные файлы в папке «Моя музыка». До Windows 7 когда вы хотели воспроизвести музыку в Windows Media Player, вам приходилось вручную указывать Windows Media Player нужную музыкальную папку и выбирать композицию. Если вы перемещали песню из папки, Windows Media Player не знал, что файл перемещен. Музыкальный файл по-прежнему отображался в списке воспроизведения, но когда приходило время воспроизвести композицию, появлялось надоедливое сообщение о том, что Windows Media Player не может найти указанный файл – все потому, что Windows Media Player не был синхронизирован с папкой «Моя музыка». Поэтому Windows Media Player должен поддерживать собственную базу данных песен и их размещений на диске, а пользователь должен обновлять эту базу вручную.

С библиотеками Windows 7 такая ошибка куда меняя вероятна. Вы можете спросить, почему? Что же, ответ очень прост. Windows Media Player, включенный в состав Windows 7, не поддерживает никакой внутренней базы данных песен, он полностью полагается на библиотеки «Музыка», «Видео» и «Изображения» в Windows 7 и полностью синхронизирован с ними. Это означает, что когда вы удаляете композицию из библиотеки «Музыка», она более не будет представлена в списке воспроизведения Windows Media Player. Нижеприведенное изображение показывает, как, щелкнув правой кнопкой мыши на вкладку Music, вы можете управлять соответствующей библиотекой.

clip_image002

Поддерживая синхронизацию

Может потребоваться, чтобы ваше приложение распознавало, когда пользователь вносит изменения в описание библиотеки, добавляет или удаляет оттуда папки или обновляет их. Есть несколько способов синхронизации в зависимости от требований приложения. В большинстве случаев следует использовать Shell Programming Model с SHChangeNotifyRegister для всех процессов, не являющихся службами.

Использование Shell Programming Model

Для определения изменений элементов в библиотеке средствами Shell Programming Model используйте функцию SHChangeNotifyRegister для отслеживания изменений элементов во всех папка библиотеки. Она может принять один элемент библиотеки, например, библиотеку «Музыка», как параметр для получения уведомлений о всем содержимом библиотеки. В таком случае приложение будет уведомлено обо ВСЕХ изменениях в статусе любых элементов в библиотеке «Музыка». К тому же, регистрация библиотеки позволит приложению получать уведомления на лету, так что библиотеки обновляются сразу после внесения изменений в библиотеку. Пользователь также может изменять папки, включаемые в библиотеку, без использования IShellLibrary API. Для этого, чтобы определить изменения в папках, включенных в библиотеку, вам необходимо вызывать SHResolveLibrary каждый раз, когда загружается библиотека. Это сохраняет изменения в папке или имени папки в файле описания библиотеки. Если пользователь добавляет, удаляет или переупорядочивает папки, используя окно управления библиотекой или интерфейсом ISHellLibrary, эти изменения будут сохранены непосредственно в файле .library-ms. Используя эту информацию, клиентское приложение может затем пересчитать папки библиотеки.

Знакомое окно управления библиотекой

И вот последняя составляющая часть библиотек Windows 7. Для соответствия между компонентами Windows и элементами управления содержимым в состав Windows 7 входит общее диалоговое окно управления библиотекой для использования в приложениях. Если приложение нуждается в управлении папками библиотеки, наподобие папки «Музыка», запрос диалогового окна управления библиотекой (SHShowManageLibraryUI) предоставит последовательный пользовательский интерфейс Windows Explorer для управления библиотеками. Если вы решите использовать его, он будет вносить изменения в библиотеку напрямую – как если бы напрямую изменял содержимое библиотеки Windows Explorer. Заметьте, что это диалоговое окно не возвращает никакой информации приложению; если вы выводите содержимое библиотеки непосредственно в своем приложении, то понадобится получить уведомления непосредственно из Shell, как описано выше.

clip_image004

По умолчанию диалоговое окно управления библиотекой запрещает добавление неподдерживаемых папок в библиотеки. Однако, если приложение зависит от содержимого папок, которые не могут быть локально или удаленно проиндексированы Windows Search, вы можете запросить диалоговое окно с флагом LMD_ALLOWUNINDEXABLENETWORKLOCATIONS, отменяющим стандартные настройки и позволяющим включать такие папки. Вы также можете использовать один из новых вызовов API, вроде SHAddFolderPathToLibrary, которые мы рассмотрели в статье о вспомогательных функциях библиотек Windows 7, для добавления папок, включая папки, которые не могут быть проиндексированы.

Эта статья завершает наше путешествие по библиотекам Windows 7. Далее мы рассмотрим Managed Code API и приступим к публикациям о панели задач Windows 7.