WP8 копирует файл SharedStorge прямо в IsolatedStorage

Я разрабатываю приложение для Windows Phone 8, но у меня много проблем с исключениями прав доступа к файлам, которые мешают утверждению моего приложения, когда я пытаюсь получить доступ к файлам в «локальной» папке (это происходит только после того, как приложение было подписано Магазин WP, а не при развертывании из Visual Studio). Чтобы решить эту проблему, я переместил все файловые операции в IsolatedStorage, и это, похоже, устранило проблемы.

Но у меня осталась только одна проблема. Мое приложение должно использовать систему расширений файлов для открытия внешних файлов, и, похоже, это связано с тем, что файл сначала копируется в локальную папку, а затем я могу вручную скопировать его в IsolatedStorage. У меня нет проблем с реализацией этого, но кажется, что исключение разрешения доступа к файлу также возникает, когда система пытается скопировать внешний файл в локальную папку.

Я думаю, что единственный способ решить эту проблему - это заставить систему напрямую копировать в IsolatedStorage, но я не могу понять, как это сделать, и возможно ли это вообще. Кажется, будто SharedStorageAccessManager может копировать только в экземпляр StorageFolder, но я понятия не имею, как создать тот, который направлен в IsolatedStorage, есть идеи?

PS. Как вы думаете, система Microsoft может подписывать мое приложение каким-то некомпетентным сертификатом или чем-то еще, потому что при развертывании приложения из Visual Studio нет намека на проблемы, это происходит только тогда, когда Microsoft тестирует его или когда я устанавливаю его из магазина используя метод отправки бета-версии.

Ниже приведен снимок экрана перехваченного исключения, отображаемого в окне сообщения при попытке открыть файл из электронного письма:

Снимок экрана исключения

РЕДАКТИРОВАТЬ: Чтобы было еще яснее, мне НЕ нужна помощь в выяснении нормальной практики использования uri глубокой ссылки для копирования внешнего файла в каталог моего приложения. Мне нужна помощь в его копировании непосредственно в изолированное хранилище или в разрешении исключения доступа к файлу.


person Gerharddc    schedule 28.12.2013    source источник
comment
Я делаю ту же работу, что и вы. Мне нужна помощь в том, как скопировать файл из локальной папки в изолированное хранилище. Не могли бы вы опубликовать новый вопрос с ответом на это?   -  person Mangesh    schedule 24.11.2014


Ответы (2)


Ожидание запуска файла

Когда ваше приложение запускается для обработки определенного типа файлов, используется URI глубинной ссылки, чтобы перенаправить пользователя в ваше приложение. В URI строка FileTypeAssociation указывает, что источником URI является файловая ассоциация, а параметр fileToken содержит токен файла.

Например, следующий код показывает URI глубинной ссылки из файловой ассоциации.

/FileTypeAssociation?fileToken=89819279-4fe0-4531-9f57-d633f0949a19

После запуска сопоставьте входящий URI глубинной ссылки со страницей приложения, которая может обрабатывать файл.

// Get the file token from the URI
// (This is easiest done from a UriMapper that you implement based on UriMapperBase)
// ...

// Get the file name.
string incomingFileName = SharedStorageAccessManager.GetSharedFileName(fileID);

// You will then use the file name you got to copy it into your local folder with
// See: http://msdn.microsoft.com/en-us/library/windowsphone/develop/windows.phone.storage.sharedaccess.sharedstorageaccessmanager.copysharedfileasync(v=vs.105).aspx 

SharedStorageAccessManager.CopySharedFileAsync(...)

Я встроил информацию о том, как это сделать, из MSDN http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj206987(v=vs.105).aspx

Прочтите эту документацию, и должно быть ясно, как использовать API, а также как настроить свой URI-сопоставитель.

Удачи :)

person grenangen    schedule 28.12.2013
comment
Да, да, я все это знаю, и уже реализовал это так, и т. Д., Копируя файл в мою временную папку, а затем в изолированное хранилище, но это дает мне исключение в изображении после прохождения процесса подписи магазина. Пожалуйста, помогите мне решить проблему, я достаточно умен, чтобы искать документацию. - person Gerharddc; 28.12.2013
comment
Ну, я не имел в виду, что это оскорбление или что-то унизительное, просто удивительно часто, что кто-то реализует что-то без правильного понимания API :) Вы выполнили тестовый комплект Windows Phone Store на xap и убедились, что необходимые возможности есть в ваш файл манифеста и т. д.? Все ли автоматизированные тесты проходят и т. Д.? - person grenangen; 28.12.2013
comment
Извините, я не хотел показаться оскорбительным или что-то в этом роде, я мог немного перегрузить его. Тоже на тестах особо ничего не подобрал. - person Gerharddc; 28.12.2013
comment
Не волнуйтесь :) Если тесты ничего не показали, я тоже немного озадачен. Обычно получение E_ACCESSDENIED при файловых операциях означает либо; Отсутствует возможность или что вы пытаетесь записать путь, в котором вам действительно не следует этого делать. Вы пробовали добавить трассировку в файл, чтобы вы могли фиксировать местоположения, которые он пытается использовать для операций копирования, поскольку это БЕТА-публикация, можно добавить такую ​​трассировку. Могу дать несколько лучших намеков / понимания того, что здесь происходит не так. - person grenangen; 28.12.2013
comment
Я посмотрю на трассировку и снова запущу тесты, как только смогу добраться до своего компьютера - person Gerharddc; 28.12.2013
comment
Кажется, я не могу запустить тест, потому что я использую MonoGame, который должен быть скомпилирован для ARM или x86, что означает отсутствие сборки ЦП, которая необходима для тестов. Тогда я должен был запустить тест в другом приложении в прошлый раз. - person Gerharddc; 28.12.2013

Хорошо, я разобрался. Каталог «install» на самом деле имеет ограниченный доступ, но по какой-то причине процесс подписи Visual Studio оставляет приложение с достаточными разрешениями для доступа к этой папке. Правильная процедура определения относительного каталога заключается не в использовании «Directory.GetCurrentDirectory ()», а в использовании «ApplicationData.Current.LocalFolder». Надеюсь это поможет!

person Gerharddc    schedule 03.01.2014