Где хранить доступные пользователю файлы в 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
> Вкладка "Возможности" и проверьте возможность, где вы хотите хранить. Пример: "Библиотека изображений" или "Съемное хранилище"