На какой бы аппаратной платформе ни выполнялась Windows 10, везде для построения приложений используется подсистема UWP. При этом каждая из платформ (будь то ноутбук, консоль или смартфон) содержит специфическое оборудование. Для него в UWP заготовлено свое пространство имен. Смартфоны имеют дополнительное оборудование, которое позволяет совершать звонки, отправлять эсэмэски, определять скорость движения, учитывать состояние, высоту, измерять пройденное расстояние, количество шагов и другое.

В прошлой статье мы начали изучать мобильную «десятку», обсудив ряд важных вопросов, в том числе способы модернизации унаследованных приложений для платформы UWP, а сегодня я предлагаю несколько рецептов для более глубокого погружения в программирование мобильной винды номер 10.

 

Содержимое хранилища

С помощью UWP можно легко просмотреть содержимое хранилища — HDD, SDD, Flash-памяти или другого носителя с любой поддерживаемой файловой системой. Поэтому рассматриваемое ниже приложение с одинаковым успехом будет работать на всех аппаратных платформах с Windows 10. Но для нас первостепенный интерес представляют смартфоны.

Создай в VS новый UWP-проект. Чтобы иметь возможность в одном приложении реализовать несколько экспериментов, каждый на отдельной странице, помести на макет компонент Pivot (многообещающее название. — Прим. ред.). Измени у первой страницы, PivotItem, значение свойства Header, например на «Поиск».

Так как на нее нам надо поставить несколько компонентов, а PivotItem этого не позволяет, поскольку внутри него объекты не должны более одного раза включать свойство Content, то нужна подложка. Пусть ее роль сыграет StackPanel. Помести последний на PivotItem. Внутри StackPanel компоненты располагаются друг над другом — стопкой, занимая всю ширину. Затем помести в стек компонент TextBox для ввода имени для поиска, назови его inputText. Ниже положи кнопку — Button — с именем Search для запуска поиска. Результат поиска будем выводить в TextBlock. Свойству TextWrapping последнего присвой значение Wrap.

Создай обработчик события нажатия кнопки. Прежде чем помещать в него код, добавим необходимые пространства имен. Во-первых, для работы с хранилищем понадобится Windows.Storage. Во-вторых, для формирования поисковых запросов в содержимом хранилища нужно будет пространство Windows.Storage.Search. Оно предоставляет классы для поиска и перечисления файлов с использованием расширенного синтаксиса запросов AQS. Наконец, чтобы работать с текстом и строками, нужно пространство имен System.Text.

Вернемся в созданный обработчик события нажатия кнопки. В Windows есть широко известный набор предопределенных папок: Music, Documents, Pictures и прочие. У меня на смартфоне куча музыки, поэтому я расположил папку для хранения музыки на SD-карте, но она по-прежнему остается папкой Music. Можно легко получить указатель на известную папку, сохранив его в объекте класса StorageFolder:

StorageFolder musicFolder = await KnownFolders.GetFolderForUserAsync(null, KnownFolderId.MusicLibrary);

Для этого асинхронно вызывается статический метод GetFolderForUserAsync класса KnownFolders. Последний предоставляет доступ к локальным библиотекам юзера. В качестве параметров метод получает: имя пользователя, библиотеку которого надо вернуть (если подразумевается текущий юзер, передается null), вторым параметром указывается член перечисления KnownFolderId, куда входят стандартные папки. В нашем случае это MusicLibrary.

Далее нам надо создать список строк, который будет предоставлять фильтр по типам файлов для выбора:

List<string> fileTypeFilter = new List<string>();
fileTypeFilter.Add(".mp3");

Следующим действием создадим объект класса QueryOptions, он позволяет задать параметры для поиска в содержимом папок. Конструктор получает два параметра: член перечисления CommonFileQuery и список расширений файлов, созданный на предыдущем шаге. Перечисление CommonFileQuery содержит члены, определяющие ход поиска и результирующий список: глубокое, неглубокое представление файлов, сортировка по определенному свойству — дате, заголовку и так далее.

QueryOptions queryOptions = new QueryOptions(CommonFileQuery.OrderBySearchRank, fileTypeFilter);

Тем самым мы определили параметры расширенного синтаксиса запросов — AQS для выборки файлов по ключевым словам. Теперь надо задать ключевое слово для поиска из строки ввода:

queryOptions.UserSearchFilter = inputText.Text;

Следующим действием создадим объект класса StorageFileQueryResult, хранящий результат запроса поиска файлов. Этот объект образуется на выходе метода CreateFileQueryWithOptions объекта StorageFolder, метод получает один параметр для поиска — объект класса QueryOptions.

StorageFileQueryResult queryResult = musicFolder.CreateFileQueryWithOptions(queryOptions);

Далее надо создать объект, в который поместить текстовые данные, — StringBuilder. После этого асинхронно заполнить коллекцию элементов — найденных файлов через метод GetFileAsync объекта класса StorageFileQueryResult, созданного на прошлом шаге.

IReadOnlyList<StorageFile> files = await queryResult.GetFilesAsync();

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

outputText.Append(files.Count + " files found:nn");

Чтобы вывести список, достаточно обработать каждый элемент коллекции:

foreach (StorageFile file in files)
    outputText.Append(file.Name + "n");

Последним действием метода заполненный объект StringBuilder выводим на экран, присвоив его свойству Text визуального компонента TextBlock.

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

Поиск файлов
Поиск файлов

Я искал по слову Nirvana, в результате у меня отобразились все файлы, находящиеся в папке Nirvana, то есть имеющие в своем пути это слово.

 

Что с папками?

Для нового эксперимента в компоненте Pivot активизируем вторую страницу. На нее помести StackPanel, а в него кнопку и TextBlock, как на первой странице.

Поскольку папки не имеют расширения, то ситуация заметно упрощается. После получения объекта StorageFolder определенной папки собираем все подпапки в коллекцию:

IReadOnlyList<StorageFolder> folderList = await picturesFolder.GetFoldersAsync();

После чего можно перебрать коллекцию и выполнить над ее элементами любые действия (см. страницу «Папки» примера FileSearch).

Перечисление папок
Перечисление папок

Продолжение статьи доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все статьи на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта, включая эту статью. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи одну статью

Заинтересовала статья, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для статей, опубликованных более двух месяцев назад.


Комментарии

Подпишитесь на ][, чтобы участвовать в обсуждении

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

Check Also

В Windows появилась функциональность для борьбы с читерами

Стало известно, что в Windows 10 Fall Creators Update, вышедшем неделю назад, заработала с…