UWP StorageFolder доступ к папке «Загрузки» - PullRequest
0 голосов
/ 08 июня 2018

Я провел массу исследований по MSDN и SO, но, похоже, на эту тему было много смешанных отзывов, и нет однозначного ответа.Мое приложение UWP должно загрузить некоторые элементы для пользователя.Кажется логичным, что это идет в папку «загрузки» вместо документов или изображений.

Что я понял из своего чтения, так это то, что приложению разрешен доступ к папке загрузок и созданию файлов и подпапок в папке загрузок.Однако он не может получить доступ к другим файлам и папкам (не созданным из вашего приложения) без использования средства выбора.В этом случае мне не нужно использовать средство выбора, потому что мое приложение использует и создает папку для себя.Я также читал, что в Манифесте не нужно специальных возможностей, чтобы это работало.

Я могу подтвердить, что на самом деле это работает, создав папку и файл в папке загрузок

StorageFile destinationFile;
StorageFolder downloadsFolder;
try
{
   //Create a sub folder in downloads
   try
   {
         downloadsFolder = await DownloadsFolder.CreateFolderAsync("AppFiles");
   }
   catch (Exception ex)
   {
       //HERE IS THE ISSUE. I get in here if the folder exists but how do i get it?
   }

   destinationFile = await downloadsFolder.CreateFileAsync(destination,CreationCollisionOption.GenerateUniqueName);
}
catch (FileNotFoundException ex)
{
     rootPage.NotifyUser("Error while creating file: " + ex.Message, NotifyType.ErrorMessage);
     return;
}

Однако здесь возникает основная проблема.Этот код отлично работает с первого раза, потому что папка еще не существует и создает ее вместе с файлом.В последующие периоды происходит сбой и возникает исключение:

Невозможно создать файл, если этот файл уже существует.(Исключение из HRESULT: 0x800700B7)

Он делает это на линии, чтобы создать папку в папке загрузок:

downloadsFolder = await DownloadsFolder.CreateFolderAsync("AppFiles");

Проблема заключается в том, что MSDN заявляет, что я не могу использоватьВарианты коллизий «OpenIfExists» или «ReplaceExisting», которые являются двумя вариантами коллизий, которые мне понадобятся для решения этой проблемы.Два оставшихся варианта меня не устраивают.Так что, несмотря ни на что, будет выброшено исключение, если папка существует.

Затем возникает мысль, что я могу просто перехватить исключение, как я уже делал в моем фрагменте выше, и открыть папку.если это существует.Проблема заключается в том, что класс «DownloadsFolder» не предоставляет никаких параметров для получения или открытия папки, а только для ее создания.

Итак, кажется, я могу создать папку из своего приложения, но не могу открыть или получить папку, созданную моим приложением?

Спасибо!

1 Ответ

0 голосов
/ 09 июня 2018

Проблема в том, что класс «DownloadsFolder» не предоставляет никаких параметров для получения или открытия папки, а только для ее создания.

На самом деле, при первом запускеваш код, вы можете создать свою папку успешно и получить экземпляр папки для создания файла в этой папке.Но почему вы не можете получить его, когда он существует, это сделано специально.

Я полагаю, вы проверили документ :

Поскольку приложение может получить доступ только кпапок в папке «Загрузки», которые он создал, вы не можете указать OpenIfExists или ReplaceExisting для этого параметра.

Итак, как получить созданную вами папку?Я расскажу вам следующее:)

В этом случае мне не нужно использовать средство выбора, поскольку мое приложение использует и создает папку для себя.

Как вы сказали, первый вариант - использовать сборщик, но вы сказали, что не хотите использовать сборщик.Затем я дам вам другой вариант.

Когда вы впервые успешно создадите папку, вы можете добавить эту папку в FutureAccessList .Затем вы можете получить эту папку прямо в своем коде.

Я сделал простой пример кода для вашей справки:

StorageFile destinationFile;
StorageFolder downloadsFolder;
try
{

    try
    {
        downloadsFolder = await DownloadsFolder.CreateFolderAsync("AppFiles");
        string folderToken = Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.Add(downloadsFolder);
        ApplicationData.Current.LocalSettings.Values["folderToken"] = folderToken;
        destinationFile = await downloadsFolder.CreateFileAsync("destination.txt", CreationCollisionOption.GenerateUniqueName);
    }
    catch (Exception ex)
    {
        if (ApplicationData.Current.LocalSettings.Values["folderToken"] != null)
        {
            string token = ApplicationData.Current.LocalSettings.Values["folderToken"].ToString();
            downloadsFolder = await Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.GetFolderAsync(token);
            destinationFile = await downloadsFolder.CreateFileAsync("destination.txt", CreationCollisionOption.GenerateUniqueName);
        }
    }

}
catch (FileNotFoundException ex)
{
    rootPage.NotifyUser("Error while creating file: " + ex.Message, NotifyType.ErrorMessage);
    return;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...