UWP StorageFolder访问Downloads文件夹

Mic*_*ord 4 .net c# windows-10 uwp windows-10-universal

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

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

我可以通过在downloads文件夹中创建文件夹和文件来确认这确实有效

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;
}
Run Code Online (Sandbox Code Playgroud)

但是,这是主要问题.此代码第一次正常工作,因为该文件夹尚不存在,并与文件一起创建.随后的一段时间,它失败并引发异常:

该文件已存在时无法创建文件.(HRESULT异常:0x800700B7)

它在行上执行此操作以在Downloads文件夹中创建文件夹:

downloadsFolder = await DownloadsFolder.CreateFolderAsync("AppFiles");
Run Code Online (Sandbox Code Playgroud)

问题是MSDN声明我不能使用"OpenIfExists"或"ReplaceExisting"的碰撞选项,这是我需要解决这个问题的两个碰撞选项.剩下的两个选项对我没有好处.因此,无论如何,如果文件夹存在,它将抛出异常.

然后,我的想法是我可以捕获异常,就像我已经在上面的代码片段中做的那样,并打开文件夹(如果它存在).这个问题是"DownloadsFolder"类没有提供任何选项来获取或打开文件夹,只是为了创建一个文件夹.

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

谢谢!

Xie*_*ven 9

这个问题是"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;
}
Run Code Online (Sandbox Code Playgroud)