locked
Launcher.LaunchFileAsync не открывает файлы RRS feed

  • Вопрос

  • Всем привет.

    пытаюсь открыть файл так

    private async void itemGridView_ItemClick(object sender, ItemClickEventArgs e)
            {
                var opts = new LauncherOptions();
                opts.TreatAsUntrusted = true;
                opts.DisplayApplicationPicker = true;
                var item = e.ClickedItem as Item;
                IStorageFile file = await StorageFile.CreateStreamedFileFromUriAsync(item.Title, new Uri(item.Url), null);
                var success = await Launcher.LaunchFileAsync(file, opts);      
            }

    Файл не открывается, success = false, в выводе приложения пишет:

    Шаг с заходом: обход кода, не являющегося кодом пользователя "System.WindowsRuntimeSystemExtensions.GetAwaiter<bool>"


    если открывать файл так:

    var success = await Launcher.LaunchFileAsync(file); 

    Файл открывается, если есть приложение которое может его открыть., аесли нет, то диалог выбора приложения для открытия файла не показывается.

    Есть соображения как заставить работать правильно?

    6 января 2013 г. 15:38

Ответы

  • Вот работающее решение.  По клику на элемент GridView проверяется наличие файла во временной папке (при отсутствии файла происходит закачка с удаленного сервера), а затем открывается.

    Покритикуйте мое решение.

    private async void itemGridView_ItemClick(object sender, ItemClickEventArgs e)
            {
                var opts = new LauncherOptions();
                opts.TreatAsUntrusted = true;
                opts.DisplayApplicationPicker = false;        
                var item = e.ClickedItem as Item;
                string name;
                if (!item.Title.Contains(item.Ext))//потому что веб-сервис обрезает длинные имена и добаляет точки
                {
                    name = item.Title.Trim(new char[] { '.', ' ' });
                    name += "." + item.Ext;
                }
                else
                {
                    name = item.Title;
                }
                StorageFile file = null;
                try
                {
                    file = await ApplicationData.Current.TemporaryFolder.GetFileAsync(name);
                }
                catch (FileNotFoundException ex)
                {
                }
                if (file == null)
                {
                    ///что бы не забивать место надеемся что система подчистит со временем файлы.
                    file = await StorageFile.CreateStreamedFileFromUriAsync(name, new Uri(item.Url), null);
                }
                else
                {
                    var success = await Launcher.LaunchFileAsync(file, opts);
                    if (!success)
                    {
                        var msg = new MessageDialog(String.Format("Приложение для открытия файла {0} не найдено", item.Title));
                        await msg.ShowAsync();
                    }
                }
            }

    • Помечено в качестве ответа V.A.Zolotov 11 января 2013 г. 19:43
    • Изменено V.A.Zolotov 11 января 2013 г. 19:49 ошибка во вставке кода
    11 января 2013 г. 19:42

Все ответы

  • Добрый день.

    Вместо CreateStreamedFileFromUriAsync воспользуйтесь GetFileFromPathAsync. Вроде должно заработать. Сейчас проверить не могу, если не получится, напишите, пойду на буке попробую...

    7 января 2013 г. 11:10
    Отвечающий
  • Добрый день.

    Вместо CreateStreamedFileFromUriAsync воспользуйтесь GetFileFromPathAsync. Вроде должно заработать. Сейчас проверить не могу, если не получится, напишите, пойду на буке попробую...

    Добрый день. 

    Нет, не помогло, не открывает. Извините, не уточнил что файл находится на удаленном ресурсе. Может в манифесте что-то указать нужно?  Кроме того, вплыл еще один интересный момент при открытии файлов Desktop программой. Modern UI приложения работают асинхронно и показывают progress bar пока файл скачивается, а тот же , к примеру, Word 2013 открывается после закачки файла с удаленного ресурса. Можно как то узнать состояние скачивания при использовании методов подобных  GetFileFromPathAsync?

    9 января 2013 г. 11:38
  • Вот работающее решение.  По клику на элемент GridView проверяется наличие файла во временной папке (при отсутствии файла происходит закачка с удаленного сервера), а затем открывается.

    Покритикуйте мое решение.

    private async void itemGridView_ItemClick(object sender, ItemClickEventArgs e)
            {
                var opts = new LauncherOptions();
                opts.TreatAsUntrusted = true;
                opts.DisplayApplicationPicker = false;        
                var item = e.ClickedItem as Item;
                string name;
                if (!item.Title.Contains(item.Ext))//потому что веб-сервис обрезает длинные имена и добаляет точки
                {
                    name = item.Title.Trim(new char[] { '.', ' ' });
                    name += "." + item.Ext;
                }
                else
                {
                    name = item.Title;
                }
                StorageFile file = null;
                try
                {
                    file = await ApplicationData.Current.TemporaryFolder.GetFileAsync(name);
                }
                catch (FileNotFoundException ex)
                {
                }
                if (file == null)
                {
                    ///что бы не забивать место надеемся что система подчистит со временем файлы.
                    file = await StorageFile.CreateStreamedFileFromUriAsync(name, new Uri(item.Url), null);
                }
                else
                {
                    var success = await Launcher.LaunchFileAsync(file, opts);
                    if (!success)
                    {
                        var msg = new MessageDialog(String.Format("Приложение для открытия файла {0} не найдено", item.Title));
                        await msg.ShowAsync();
                    }
                }
            }

    • Помечено в качестве ответа V.A.Zolotov 11 января 2013 г. 19:43
    • Изменено V.A.Zolotov 11 января 2013 г. 19:49 ошибка во вставке кода
    11 января 2013 г. 19:42
  • Привет.

    Спасибо, что поделились решением проблемы.

    Не оставляйте catch блок пустым, это потом может усложнить вам отладку.


    Для связи [mail]

    14 января 2013 г. 8:00