UWP StorageFolder访问Downloads文件夹

时间:2018-06-08 16:23:21

标签: c# .net uwp windows-10 windows-10-universal

我已经对MSDN和SO做了大量的研究,但似乎有很多关于这个主题的混合评论,没有直截了当的答案。我的UWP应用程序需要为用户下载一些项目。它进入"下载"似乎是合乎逻辑的。文件夹而不是文档或图片。

我从阅读中收集的内容是允许应用程序访问下载文件夹并在下载文件夹中创建文件和子文件夹。但是,如果不使用选择器,它将无法访问其他文件和文件夹(不是从您的应用程序创建的)。在这种情况下,我不需要使用选择器,因为我的应用程序正在使用并为自己创建文件夹。我也读过,Manifest中不需要特殊的功能来实现这个功能。

我可以通过在下载文件夹

中创建文件夹和文件来确认这确实有效
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"的冲突选项。或"替换现有"这是我需要解决这个问题的两个碰撞选项。剩下的两个选项对我没有好处。因此,无论如何,如果文件夹存在,它将抛出异常。

然后,我的想法是我可以抓住异常,就像我已经在上面的代码片段中做的那样,并打开文件夹(如果它存在)。这个问题是" DownloadsFolder" class不提供获取或打开文件夹的任何选项,仅用于创建文件夹。

所以,似乎我可以从我的应用程序创建文件夹,但我无法打开或获取我的应用程序创建的文件夹?

谢谢!

1 个答案:

答案 0 :(得分:7)

  

问题在于“DownloadsFolder”类没有提供任何获取或打开文件夹的选项,只是为了创建文件夹。

实际上,当您第一次运行代码时,您可以成功创建文件夹并获取文件夹实例以在此文件夹中创建文件。但是为什么当它存在时你无法得到它,这是设计的。

我相信您已查看document

  

由于应用只能访问其创建的“下载”文件夹中的文件夹,因此无法为此参数指定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;
}