Доступ к StorageFile запрещен в Windows 8
У меня есть приложение в стиле metro, которое опрашивает файл (который является ссылкой на StorageFile
объект) хранится в изолированном хранилище каждые X секунд.
Это файл PDF, и в моем приложении я разрешаю пользователю открывать документ и вносить в него изменения с помощью собственного приложения Reader.
Моя проблема в том, что я звоню OpenStreamForReadAsync
на StorageFile
когда я опрашиваю документ, но если вы делаете это в точный момент, когда пользователь сохраняет изменения, внесенные в документ в приложении Reader, я получаю Access denied
исключение выбрасывается.
Я предполагаю, что это потому, что Windows пишет в файл, и это нормально, мне просто нужно знать, как я могу запросить локальный StorageFile
ссылка, чтобы увидеть, если я могу открыть его. (в идеале без звонка OpenStreamForReadAsync
завернутый в попытку поймать).
2 ответа
Команда Windows скажет вам сделать попытку / поймать вещь. Это то, что они сказали мне, когда я попросил API File.Exists ().
Причина заключается в следующем: предположим, что искомый API существует... что произойдет, если в течение миллисекунд между вызовом этого API и попыткой открыть файл файл будет открыт / удален / переименован? БУМ! Вы вернулись к исходному исключению и вам нужно сделать попытку / поймать, чтобы избежать трудно воспроизводимых сбоев. Так как вам все равно нужно перехватить это исключение, вы можете просто поймать это исключение. Не предоставляя File.Exists или искомый API, они заставляют нас ловить исключение, чтобы пользователи не сталкивались с этими редкими ошибками состояния гонки.
Если вы предпочитаете не использовать блок Try Catch, вам придется вручную отслеживать, какие файлы вы обновляете в любой момент времени. Перед асинхронным вызовом для сохранения файла добавьте уникальный идентификатор для файла, например его путь, или хешированное значение его пути к коллекции списков. Затем сразу же после ожидающего сохранения, удалите его из этого списка.
Каждый раз, когда вы идете опрашивать ваш PDF, проверьте, есть ли его UID в вашем списке. Если он есть в списке, отложите проверку. Продолжайте откладывать проверку, пока ее больше нет в этом списке.
ИЛИ Вы также можете просто создать логическую переменную blnSaving уровня модуля. Перед сохранением установите значение true. После завершения сохранения установите значение false. При опросе PDF отложите проверку, если для этого значения установлено значение true.