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 вы можете получить доступ только к следующим файлам и папкам:

  • Каталоги, которые объявлены в файле манифеста (например, папка Documents, Pictures, Videos)
  • Каталоги и файлы, которые пользователь выбрал вручную с помощью FileOpenPicker или FolderPicker
  • Файлы из FutureAccessList или MostRecentlyUsedList
  • Файлы, которые открываются с расширением файла ассоциации или через общий доступ

Если вам нужен доступ ко всем файлам в 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 года по умолчанию установлено значение Выкл.

Больше информации