Статьи

Обзор Windows Phone 8 SDK: сопоставление файлов — часть 1

Одним из самых больших ограничений для разработчиков Windows Phone была невозможность обмена данными между приложениями. Это не ограничивалось сторонними приложениями, но и типы файлов, которые поддерживаются нативными приложениями (просто подумайте о файлах Office), нельзя было открыть напрямую: обходной путь состоял в том, чтобы открыть файл с помощью браузера, таким образом, если файл Тип был поддержан ОС, он был открыт с правильным приложением. Самая большая проблема этого обходного пути заключается в том, что он работал только в том случае, если файл был доступен онлайн: он не работал с файлами, которые хранились в изолированном хранилище.

С огромными аплодисментами мы приветствуем протокол и сопоставление файлов в Windows Phone 8, функции, которая идет непосредственно из Windows 8 и позволяет вашему приложению регистрироваться для определенного протокола или расширения файла; таким образом, другие приложения могут просто запустить запрос на открытие определенного файла или URL-адреса, и ОС позаботится о перенаправлении операции в одно из доступных приложений, зарегистрированных для этого типа файлов.

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

Что происходит, когда стороннее приложение пытается открыть файл? ОС ищет приложения, которые в файле манифеста зарегистрированы для поддержки этого типа файлов: если не найдено ни одного приложения, пользователю предлагается перейти в Магазин, чтобы загрузить приложение, способное управлять этим типом файла. Если на устройстве установлено несколько приложений, способных управлять одним и тем же расширением, у пользователя спрашивают, какое из них он хочет использовать; вместо этого, если доступно только одно приложение, оно открывается напрямую.

В этом уроке мы сосредоточимся на ассоциации файлов: мы поговорим об ассоциации протоколов в другом посте. В примере, который мы будем использовать для этого урока, мы создадим два отдельных приложения для Windows Phone 8: первое будет называться «средство запуска», и это будет приложение, которое запустит запрос файла, который будет обработан. приложением «читатель», которое будет «прослушивать» расширение определенного типа и получать файлы. Мы зарегистрируем   расширение .log и будем использовать его для обмена файлом с текстом внутри двух приложений.

Приложение «launcher»: как открыть файл

В приложении запуска мы собираемся выполнить две задачи: первая — создать файл журнала, который будет простым текстовым файлом. Второй — «запустить» этот файл, чтобы приложение для чтения могло его использовать. Давайте начнем создавать файл журнала: для этого шага мы будем использовать класс, который добавляет два простых метода расширения для работы со строками. Первый называется WriteToFile  и может использоваться для записи строки в файл в локальном хранилище; второй называется  ReadFromFile  и выполняет противоположную задачу: читает текстовый файл из локального хранилища и возвращает его в виде строки.

Давайте начнем создавать класс, который будет содержать наши методы расширения: для этого просто создайте новый класс (щелкнув правой кнопкой мыши по вашему проекту и выбрав «  Добавить новый файл» ) и отметьте его как статический. В этом посте мы увидим   метод WriteToFile , так как он единственный, который мы собираемся использовать в приложении запуска.

namespace ShareData.Launcher.Helpers
{
    public static class FileExtensions
    {   
        public static async Task WriteToFile(this string contents, string fileName, StorageFolder folder = null)
        {
            folder = folder ?? ApplicationData.Current.LocalFolder;
            var file = await folder.CreateFileAsync(
                fileName,
                CreationCollisionOption.ReplaceExisting);
            using (var fs = await file.OpenAsync(FileAccessMode.ReadWrite))
            {
                using (var outStream = fs.GetOutputStreamAt(0))
                {
                    using (var dataWriter = new DataWriter(outStream))
                    {
                        if (contents != null)
                            dataWriter.WriteString(contents);
 
                        await dataWriter.StoreAsync();
                        dataWriter.DetachStream();
                    }
 
                    await outStream.FlushAsync();
                }
            }
        }
    }
}

Метод берет строку и сохраняет ее в файл в локальном хранилище, имя которого указывается в качестве параметра. Метод также принимает другой параметр, типом которого является StorageFolder  (который определяет папку в локальном хранилище): мы можем использовать его в случае, если мы хотим сохранить файл в определенной папке. Если вы не установите этот параметр, файл будет создан в корне хранилища.

Этот метод использует стандартные API WinRT для создания файла в хранилище и использует OutputStream  и   класс DataWriter для записи содержимого строки в классе.

Следующим шагом является установка   пакета Microsoft.Bcl.Async из NuGet, который мы научились использовать  в этом посте : цель состоит в том, чтобы использовать  методы async  WebClient для загрузки содержимого RSS-канала и его сохранения в файл.

Теперь давайте поработаем над пользовательским интерфейсом: мы просто добавим две кнопки в  MainPage.xaml , одну для загрузки XML и записи файла, а другую для его «открытия».

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <StackPanel>
        <Button Content="Create file" Click="OnCreateFileButtonClicked" />
        <Button Content="Open file" Click="OnOpenFileButtonClicked" />
    </StackPanel>
</Grid>

Благодаря созданному нами методу   расширения и методам расширения WebClient, которые мы добавили, установив   пакет Microsoft.Bcl.Async , очень легко выполнить нашу задачу: загрузить XML и сохранить в файл с расширением .log. :

private async void OnCreateFileButtonClicked(object sender, RoutedEventArgs e)
{
    WebClient client = new WebClient();
    string result = await client.DownloadStringTaskAsync("http://feeds.feedburner.com/qmatteoq_eng");
 
    await result.WriteToFile("rss.log");
}

Мы просто загружаем RSS, используя  метод DownloadStringTaskAsync  (в этом примере мы загружаем RSS-канал этого блога), и сохраняем его в файле  file.log , который находится в корне локального хранилища.

Теперь пришло время открыть файл:

private async void OnOpenFileButtonClicked(object sender, RoutedEventArgs e)
{
    StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync("rss.log");
    Windows.System.Launcher.LaunchFileAsync(file);
}

Также в этом случае операция действительно проста: мы получаем ссылку на файл (используя  метод GetFileAsync ), а затем открываем его с  помощью  метода LaunchFileAsync класса Launcher  . Что должно случиться? На этом этапе обучения вам будет выдано сообщение с сообщением о том, что у вас нет приложения, способного открывать   файлы .log, и вас спросят, хотите ли вы найти его в Магазине. На данный момент просто проигнорируйте сообщение: в следующем посте мы собираемся создать приложение для чтения, которое зарегистрирует  расширение .log  и сможет открыть наш файл.

Если вы хотите попробовать эту функцию, пока я не опубликую следующий пост, попробуйте переименовать файл, сохраненный приложением, в  rss.txt , просто изменив имя, которое передается в result.WriteToFile ()  и  LocalFolder. Методы GetFileAsync ()  . Поскольку  .txt  является расширением, зарегистрированным операционной системой, файл будет открыт с помощью Word, и вы сможете прочитать содержимое файла XML.

Продолжение следует

В следующем посте мы собираемся разработать собственное приложение для чтения, которое сможет перехватить и открыть   файл file.log, который мы создали в этом посте. Оставайтесь в курсе!