Опубликован: 02.08.2013 | Доступ: свободный | Студентов: 468 / 15 | Длительность: 18:38:00
Специальности: Программист
Самостоятельная работа 22:

Работа с SD-картой, сопоставление типов файлов

Коснувшись имени файла в списке, мы инициируем переход на страницу FileViewPage.xaml. В XAML-коде страницы присутствует текстовый блок, в который мы выводим содержимое файла. Так же мы устанавливаем заголовок страницы в зависимости от того, с каким именно файлом мы работаем – с тем, который получен через систему сопоставления файлов, или с тем, который получен с SD-карты. В Листинге 59.6 показан код страницы.

using System;
using System.Linq;
using System.Windows;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Storage;
using System.IO;
using System.Threading.Tasks;
using Windows.Storage;

namespace P22_1
{
    public partial class FileViewPage : PhoneApplicationPage
    {
        // Маркер файла, полученныый при запуске приложения по сопоставлению с типом файла
        private string _fileToken;

        // Путь к файлу на SD-карте, переданный при вызове из MainPage.xaml.cs.
        private string _sdFilePath;

        private const string MYAPP_FOLDER_NAME = "Myapp_external";

        public FileViewPage()
        {
            InitializeComponent();
        }

        // Получение либо пути к файлу, либо маркера, в зависимости от того, как открыта страница 
        protected override async void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            // Открытие по сопоставлению с типом файла.
            if (NavigationContext.QueryString.ContainsKey("fileToken"))
            {
                _fileToken = NavigationContext.QueryString["fileToken"];
                await ProcessExternalFile(_fileToken);
            }
            // Открыти для чтения файла с SD-карты
            else if (NavigationContext.QueryString.ContainsKey("sdFilePath"))
            {
                _sdFilePath = NavigationContext.QueryString["sdFilePath"];
                await ProcessFile(_sdFilePath);
            }
        }

        // Обработка файла с SD-карты.
        private async Task ProcessFile(string _sdFilePath)
        {
            // Подключение к SD-карте.
            ExternalStorageDevice sdCard = (await ExternalStorage.GetExternalStorageDevicesAsync()).FirstOrDefault();

            // Если подключиться удалось, читаем файл с карты
            
            if (sdCard != null)
            {
                try
                {
                    // Получаем файл с SD-карты.
                    ExternalStorageFile file = await sdCard.GetFileAsync(_sdFilePath);

                    // Создаём поток.
                    Stream s = await file.OpenForReadAsync();

                    // Читаем данные из файла.
                    ReadFile(s);
                    // Обновлям заголовок страницы
                    txtPageName.Text = "файл с карты";
                }
                catch (FileNotFoundException)
                {
                    // Файла нет на SD-карте.
                    MessageBox.Show("Запрошенного файла нет на карте");
                }
            }
            else
            {
                // Нет SD-карты.
                MessageBox.Show("SD-карта не найдена. 
Подключите SD-карту, на которой есть папка Myapp с хотя бы одним 
.myapp-файлом и попробуйте снова.");
            }
        }

        // Обработка внешнего файла, для открытия которого вызвано приложение.
        public async Task ProcessExternalFile(string fileToken)
        {
            // Создадим или откроем папку Myapp_external.
            IStorageFolder myappFolder = await Windows.Storage.ApplicationData
.Current.LocalFolder.CreateFolderAsync(MYAPP_FOLDER_NAME, CreationCollisionOption.OpenIfExists);

            // Получим полное имя открываемого файла.
            string incomingMyappFilename = Windows.Phone.Storage.SharedAccess.SharedStorageAccessManager.GetSharedFileName(fileToken);

            // Скопируем .myapp-файл в папку Myapp_external.
            IStorageFile routeFile = await Windows.Phone.Storage.SharedAccess.SharedStorageAccessManager.CopySharedFileAsync
((StorageFolder)myappFolder, incomingMyappFilename, 
NameCollisionOption.GenerateUniqueName, fileToken);

            // Создадим поток.
            var s = await routeFile.OpenReadAsync();

            // Читаем данные из файла.
            ReadFile(s.AsStream());

            txtPageName.Text = "файл извне";
        }

        // Чтение данных файла из потока
        public void ReadFile(System.IO.Stream routeStream)
        {
           StreamReader sr = new StreamReader(routeStream);
           txtFileContent.Text = sr.ReadToEnd();
       }
    }
}
Листинг 59.6. Код страницы FileViewPage.xaml.cs

Обратите внимание на то, как при переходе на страницу (метод OnNavigatedTo) выполняется анализ параметров, поступивших на страницу в строке запуска. Если она открывается для обработки внешнего файла – работает одна ветвь кода, если для обработки файла с SD-карты – другая.

Приложение, подобное этому, нужно тестировать на аппаратном устройстве, работающем под управлением Windows Phone, так как эмулятор Windows Phone в настоящий момент не поддерживает эмуляцию SD-карты, сопоставление типов файлов так же проверяют на реальном устройстве, попытавшись, например, открыть соответствующий файл из почтового вложения.

Выводы

Разработка приложения, поддерживающего обработку файлов тех типов, которые не зарезервированы для системы или системных приложений, позволяет расширить с помощью этого приложения возможности системы. Использование SD-карты для хранения файлов, которые может обрабатывать такое приложение, позволяет пользователю передавать на устройство файлы, просто записывая их на SD-карту при подключении устройства к компьютеру. Это особенно удобно для работы с файлами больших объемов, так как ранее подобное было возможно лишь с использованием службы SkyDrive, что, при условии подключения телефона к медленной или дорогой линии связи с Интернетом, не так удобно, как прямая передача файлов на устройство.

Задание

Проанализируйте приложение, разработкой которого вы занимаетесь. Подумайте о том, работает ли это приложение с файлами, для обработки которых не используются системные приложения. Если это так – рассмотрите возможность настройки для приложения сопоставления с такими типами файлов и использования его в системе в качестве обработчика таких файлов. Кроме того, рассмотрите возможность использования в вашем приложении SD-карты. Отразите исследования в отчете.

Дополнительные материалы

К данной лекции подготовлено видеоприложение и демонстрационный программный проект.