Как стать автором
Обновить

О некоторых особенностях Windows 8 и WinRT(метро)-приложений

Время на прочтение4 мин
Количество просмотров31K
Речь пойдет о новом типе приложений, которые предназначены для новой операционной системы Windows 8 и нового меню “Пуск”.



Хочу сразу отметить, что несмотря на все написанное ниже — технология мне понравилась, однако традиционный подход Microsoft — “сделать все хорошо, но что-нибудь наиболее часто используемое — плохо” — тут наблюдается во всей красе.



Если вы программировали под WPF или Silverlight, то создание WinRT (метро) приложений — в части программирования интерфейса — для вас не вызовет никаких сложностей. Более того — отдельные новые контролы очень сильно упрощают проектирование интерфейсов, но об этом лучше почитать какую-нибудь полезную книгу.

Все подводные камни — в другом.

Во-первых, можете смело забыть про полный доступ к любым папкам и файлам на компьютере к которому имеет достут тот пользователь, с правами которого выполняется ваша программа. Да, даже если это администратор. И да! Еще один сюрприз — UAC для метро-приложений тоже не работает. В том смысле — что он теперь только для обычных (старых) приложений.

Второе. Работать с файлами на компьютере все-таки можно, но не без трудностей. В частности, ваше приложение может иметь доступ к следующим местам:
  1. Библиотеки: Документы, Видео, Изображения, Музыка
  2. Папка “Загрузки” пользователя
  3. Папки приложения в профиле пользователя
  4. Папка, куда было установлено ваше приложение
  5. Папка/файл, доступ к которому вам предоставил пользователь


Итак, начнем по пунктам.

1. Библиотеки.


Помните эту странную штуку, которая появилась еще в Vista, но которой практически никто не пользовался? (Ну, по крайней мере я точно не пользовался — из Far’а это как-то уж совсем неудобно)

Радуйтесь! Теперь вам полюбому придется ими пользоваться.

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



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



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

Особняком стоит библиотека “Документы”, доступ к которой просто так не получишь — необходимо сначала указать те типы файлов (расширения), с которыми наше приложение будет работать:



Где расположены папки-библиотеки узнавать не надо — доступ к ним можно получить через класс KnownFolders

2. Папка “Загрузки” пользователя


Ну тут все просто — доступ только на запись. Можно создать файл без участия пользователя и записать туда что-то.

3. Папки приложения в профиле пользователя


Имеем две папки: Local и Roaming. Одна лежит на текущем компьютере, другая перемещается если профиль пользователя хранится централизованно, например, на контроллере домена. Вообщем, все как и раньше (см. папку C:\Users\”юзер”\AppData\ подпапки Local и Roaming), только теперь доступ к этим папкам имеет только ваше приложение.

4. Папка, куда было установлено ваше приложение


Ваше приложение имеет полный доступ к любому файлу/папке и может делать с ними все что захочет.

5. Папка/файл, доступ к которому вам предоставил пользователь


А вот теперь, собственно, самое интересное.

Единственный способ добраться до папки/файла, который не находится в перечисленных выше местах — только через использование классов FolderPicker и FilePicker.

Делается это примерно так:
FolderPicker fp = new FolderPicker();
fp.ViewMode = PickerViewMode.Thumbnail;
fp.FileTypeFilter.Add(".jpg");

StorageFolder folder = await fp.PickSingleFolderAsync();
if (folder == null) return;

var files = await folder.GetFilesAsync();
foreach(var file in files)
    …;


После чего пользователь увидит вот такое окно:



И вы получаете полный доступ к выбранному пользователем.

Кстати, заметили async/await?
Привыкайте — синхронных функций больше нет. Ну, по крайней мере тех, которые чаще всего требуются. Например, если раньше можно было считать данные из файла одной строчкой вида:
string[] lines = File.ReadAllLines("filename.txt"); 

Теперь это будет что-то такое:
IList<string> lines = await ReadFileAsync("filename.txt"); 


Кстати, сюрприз — MessageBox’а больше нет :) Теперь это опять-таки будет что-то вида:
await ShowMessage(“Текст”);


И тут мы натыкаемся еще на одну проблему: await можно использовать только в функциях помеченный как async. Естественно, что не каждую функцию можно так пометить.
В этом случае помогает вынести весь необходимый код в отдельную функцию, а потом в нужном нам месте дождаться ее завершения:
public async Task<object> MyAsyncFunction()
{
	return await …;
}

public MySyncFunction()
{
	var res=MyAsyncFunction();
	res.Wait();
	if(res.Result==...) ...;
}


Однако такой код иногда виснет, но не падает. Поэтому отлаживать его — одно удовольствие.

Заключение

Как я уже писал выше — в целом, технология интересная, однако, если ваше приложение хочет активно работать с файлами на дисках, да еще и в тайне от пользователя — то это не ваш выбор. Зато сделать приложение, которое будет загружать и рисовать кошечек с интернета можно буквально не прикасаясь к клавиатуре
Теги:
Хабы:
+23
Комментарии48

Публикации

Изменить настройки темы

Истории

Работа

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн