Windows 10 Universal App File/Directory Access
Я разрабатываю приложение, которое читает jpeg и pdf файлы из настраиваемого местоположения в файловой системе.
В настоящее время в WPF реализована работающая версия, и теперь я пытаюсь перейти к новым приложениям Windows Universal.
Следующий код отлично работает с WPF:
public IList<string> GetFilesByNumber(string path, string number)
{
if (string.IsNullOrWhiteSpace(path))
throw new ArgumentNullException(nameof(path));
if (string.IsNullOrWhiteSpace(number))
throw new ArgumentNullException(nameof(number));
if (!Directory.Exists(path))
throw new DirectoryNotFoundException(path);
var files = Directory.GetFiles(path, "*" + number + "*",
SearchOption.AllDirectories);
if (files == null || files.Length == 0)
return null;
return files;
}
Используя универсальные приложения, я столкнулся с некоторыми проблемами:
-
Directory.Exists
недоступен
- Как я могу читать из каталогов вне моего хранилища приложений?
Для чтения из другого каталога вне хранилища приложений я попробовал следующее:
StorageFolder folder = StorageFolder.GetFolderFromPathAsync("D:\\texts\\");
var fileTypeFilter = new string[] { ".pdf", ".jpg" };
QueryOptions queryOptions = new QueryOptions(CommonFileQuery.OrderBySearchRank, fileTypeFilter);
queryOptions.UserSearchFilter = "142";
StorageFileQueryResult queryResult = folder.CreateFileQueryWithOptions(queryOptions);
IReadOnlyList<StorageFile> files = queryResult.GetFilesAsync().GetResults();
Дело в том, что он не работает, но я получаю исключение:
Исключение типа "System.UnauthorizedAccessException" произошло в TextManager.Universal.DataAccess.dll, но не было обработано в коде пользователя Дополнительная информация: Доступ запрещен. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))
Я знаю, что вам нужно настроить некоторые разрешения в манифесте, но я не могу найти подходящий для операций ввода-вывода файловой системы...
У кого-то есть такие проблемы/возможное решение?
Решение:
Из решений, которые дал мне @Rico Suter, я включил FutureAccessList в сочетании с FolderPicker. Также возможно получить доступ к записи с помощью Token после перезагрузки программы.
Я также могу рекомендовать Руководства по UX и этот образец Github.
Большое спасибо!
Ответы
Ответ 1
В приложениях UWP вы можете получить доступ только к следующим файлам и папкам:
Если вам нужен доступ ко всем файлам в D:\
, пользователь должен вручную выбрать диск D:\
с помощью FolderPicker, тогда у вас есть доступ ко всему на этом диске...
ОБНОВИТЬ:
В Windows 10 build 17134 (обновление за апрель 2018 г., версия 1803) добавлены дополнительные возможности доступа к файловой системе для приложений UWP:
-
Любому приложению UWP (обычному оконному приложению или консольному приложению), которое объявляет AppExecutionAlias
, теперь предоставляется неявный доступ к файлам и папкам в текущем рабочем каталоге и в нисходящем режиме, когда оно активируется из командной строки. Текущий рабочий каталог находится в любой файловой системе, которую пользователь выберет для выполнения ваших AppExecutionAlias.
-
Новая возможность broadFileSystemAccess
предоставляет приложениям такой же доступ к файловой системе, что и пользователю, который в данный момент запускает приложение, без подсказок стиля средства выбора файлов. Этот доступ может быть установлен в манифесте следующим образом:
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
...
IgnorableNamespaces="uap mp uap5 rescap">
...
<Capabilities>
<rescap:Capability Name="broadFileSystemAccess" />
</Capabilities>
Эти изменения и их намерения подробно обсуждаются в статье MSDN Magazine под названием " Универсальная платформа Windows - закрытие пробелов UWP-Win32". В статьях отмечается следующее:
Если вы объявляете о каких-либо ограниченных возможностях, это вызывает дополнительную проверку во время отправки пакета в Магазин для публикации.... Вам не нужен AppExecutionAlias
если у вас есть эта возможность. Поскольку это такая мощная функция, Microsoft предоставит такую возможность только в том случае, если разработчик приложения предоставит убедительные причины для запроса, описание того, как это будет использоваться, и объяснение того, как это принесет пользу пользователю.
в дальнейшем:
Если вы объявляете возможность broadFileSystemAccess
, вам не нужно объявлять какие-либо из более узко ограниченных возможностей файловой системы (Документы, Изображения или Видео); действительно, приложение не должно объявлять ни broadFileSystemAccess
ни какие-либо из трех других возможностей файловой системы.
в конце концов:
Даже после того, как приложению была предоставлена возможность, существует также проверка во время выполнения, поскольку это представляет собой проблему конфиденциальности для пользователя. Как и другие вопросы конфиденциальности, приложение при первом использовании вызовет запрос согласия пользователя. Если пользователь отказывает в разрешении, приложение должно быть устойчивым к этому.
Ответ 2
Принятый ответ больше не является полным. Теперь можно декларировать broadFileSystemAccess
в манифесте приложения для произвольного чтения файловой системы.
Страница прав доступа к файлам содержит подробную информацию.
Обратите внимание, что пользователь все еще может отозвать это разрешение через приложение настроек.
Ответ 3
В соответствии с документом MSDN: "Сборщик файлов позволяет приложению получать доступ к файлам и папкам, прикреплять файлы и папки, открывать файл и сохранять файл".
https://msdn.microsoft.com/en-us/library/windows/apps/hh465182.aspx
Вы можете прочитать файл, используя filepicker, через стандартный пользовательский интерфейс.
Привет
Ответ 4
это неверно:
Файлы, которые открываются ассоциацией расширения файлов или через общий доступ
попробуйте, открыв файлы из почты (Outlook) или с рабочего стола...
он просто не работает
вы сначала должны предоставить права на сборщик файлов.
поэтому это ist sh...
Ответ 5
Вы можете сделать это из пользовательского интерфейса в VS 2017.
Нажмите на файл манифеста → Возможности → Проверить библиотеку фотографий или любой другой материал, который вы хотите.
![enter image description here]()
Ответ 6
Это ограниченная возможность. Доступ настраивается в Настройки> Конфиденциальность> Файловая система. и включить доступ для вашего приложения. Поскольку пользователи могут предоставлять или отклонять разрешение в любое время в Настройках, вы должны убедиться, что ваше приложение устойчиво к этим изменениям. Если вы обнаружите, что ваше приложение не имеет доступа, вы можете попросить пользователя изменить настройки, предоставив ссылку на статью о доступе к файловой системе Windows 10 и конфиденциальности. Обратите внимание, что пользователь должен закрыть приложение, переключить настройку и перезапустить приложение. Если они переключают параметр во время работы приложения, платформа приостановит ваше приложение, чтобы вы могли сохранить состояние, а затем принудительно прервет приложение, чтобы применить новый параметр. В обновлении за апрель 2018 года разрешение по умолчанию включено. В обновлении за октябрь 2018 года по умолчанию установлено значение Выкл.
Больше информации