UWP c#如何获取应用程序下载文件夹的StorageFolder对象

时间:2017-03-15 17:24:36

标签: c# uwp

我正在使用DownloadsFolder方法创建文件和文件夹。

我想将父文件夹作为StorageFolder实例,这样我就可以列出并操作应用程序下载文件夹中的所有项目。

我已尝试来自已知GetParentAsync()的{​​{1}},但返回为空。

StorageFile

是否有任何方法可以通过编程方式访问此文件夹?

3 个答案:

答案 0 :(得分:2)

您的应用似乎无权阅读Downloads目录。我们可以使用GetParentAsync来获取应用拥有权限的父级,但不能获取应用没有权限的文件夹。

如果我们将音乐库,图片库和视频库添加到appxmanifest的功能中,我们可以使用GetParentAsync方法将父文件夹作为StorageFolder添加到这些文件夹中。

  

如果您在“下载”文件夹中创建文件或文件夹,我们建议您将该项目添加到应用程序的FutureAccessList中,以便您的应用程序以后可以轻松访问该项目。

有关详细信息,请参阅Locations Windows Store apps can access

因此,如果您想获取DownloadsFolder中的其他文件夹和文件,您应该能够Open files and folders with a picker

答案 1 :(得分:0)

看来这是不可能的-您可以像这样直接使用路径与System.IO来获取存储文件夹

var downloadPath = System.IO.Path.GetDirectoryName(storageFile.Path);
var downloadsFolder = await StorageFolder.GetFolderFromPathAsync(downloadPath);

但是GetFolderFromPathAsync似乎引发了异常,我认为Windows不会为您提供对此文件夹的引用。

答案 2 :(得分:0)

一种解决方案是使用文件夹选择器ONCE来选择下载文件夹(作为应用程序初始设置的一部分)。之后,该应用程序可以完全访问downloads文件夹。

此代码需要调用一次:

        var folderPicker = new FolderPicker();
        folderPicker.SuggestedStartLocation = PickerLocationId.Downloads;
        folderPicker.FileTypeFilter.Add("*");

        StorageFolder folder = await folderPicker.PickSingleFolderAsync();
        if (folder != null)
        {
            // Application now has read/write access to all contents in the picked folder
            // (including other sub-folder contents)
            Windows.Storage.AccessCache.StorageApplicationPermissions.
            FutureAccessList.AddOrReplace("DownloadFolderToken", folder);


            var messageDialog = new MessageDialog("Download folder: " + folder.Name);


            await messageDialog.ShowAsync();
        }
        else
        {
            var messageDialog = new MessageDialog("Operation cancelled");
            await messageDialog.ShowAsync();
        }

此代码可用于直接访问下载文件夹:

        var downloadsFolder = await StorageApplicationPermissions.FutureAccessList.GetFolderAsync("DownloadFolderToken");

        IReadOnlyList <StorageFile> fileList = await downloadsFolder.GetFilesAsync();

        StringBuilder outputText = new StringBuilder();

        outputText.AppendLine("Files:");
        foreach (StorageFile file in fileList)
        {
            outputText.Append(file.Name + "\n");
            await file.DeleteAsync();
        }