Где хранить доступные пользователю файлы в UWP?

У меня здесь кроссплатформенное приложение, которое использует DependencyService чтобы получить путь к файлу моего журнала. Это прекрасно работает для ApplicationData.Current.LocalCacheFolder.Path, но теперь файл журнала должен быть доступен пользователю. Идея заключалась в том, что пользователь подключает свое устройство к ПК, копирует с него файл журнала и затем отправляет его мне по обычной электронной почте. (В настоящее время не планируется распространять приложение через магазин, и не гарантируется, что пользователь настроил учетную запись электронной почты на своем устройстве.)

Сначала я попробовал с KnownFolders.DocumentsLibrary, но здесь я получаю Access is denied, Если я загляну в документацию, эта папка не предназначена для моего использования. Другие локации тоже не подходят.

Возможен ли такой подход в UWP?

2 ответа

Решение

Новый ансер:

Я узнал что Access denied происходит только на рабочем столе, а не на мобильном телефоне. После этого я нашел этот пост, в котором описано, почему это происходит. Это из-за обработки разрешений и того, что я выбрасываю свои разрешения. Есть несколько способов, как справиться с этой ситуацией:

  • Используйте сборщик, чтобы спросить пользователя
  • использование FutureAccessList

Пример:

FolderPicker folderPicker = new FolderPicker();
folderPicker.FileTypeFilter.Add("*");
StorageFolder folder = await folderPicker.PickSingleFolderAsync();
if (folder != null)
{
    StorageApplicationPermissions.FutureAccessList.AddOrReplace("PickedFolderToken", folder);
}
StorageFolder newFolder;

newFolder = await StorageApplicationPermissions.FutureAccessList.GetFolderAsync("PickedFolderToken");
await newFolder.CreateFileAsync("test.txt");

Пример:

StorageFolder tempFolder = await StorageFolder.GetFolderFromPathAsync(Path.Combine(ApplicationData.Current.LocalCacheFolder.Path, "YourApp"));
StorageFile tempFile = await tempFolder.CreateFileAsync(Path.GetFileName(pathToAttachment), CreationCollisionOption.ReplaceExisting);
await file.CopyAndReplaceAsync(tempFile);

Старый ответ:

Мое текущее решение состоит в том, что я предлагаю кнопку в моем приложении, которая изначально вызывает FolderPicker с помощью DependencyService и только на UWP. При этом пользователь может выбрать местоположение, и я скопирую файл в это место. Работает хорошо, несмотря на то, что мне не хотелось бы что-то делать только для одной платформы.

Вам нужно добавить возможности documentsLibrary чтобы получить доступ KnownFolders.DocumentsLibrary

Чтобы добавить, перейдите в "Package.appxmanifest" в YourApp.UWP > Вкладка "Возможности" и проверьте возможность, где вы хотите хранить. Пример: "Библиотека изображений" или "Съемное хранилище"

Другие вопросы по тегам