Directory.EnumerateFiles在UWP中返回0个文件

时间:2017-06-28 20:46:43

标签: c# file uwp

在我的控制台应用程序中,我使用

var allFiles = Directory.EnumerateFiles(directoryPath, "*.*", SearchOption.AllDirectories).ToList();

返回文件夹(以及所有子文件夹)中每个文件的路径。

然而在UWP中,使用相同的东西会返回0

    FolderPicker folderPicker = new FolderPicker();
    folderPicker.SuggestedStartLocation = PickerLocationId.ComputerFolder;
    folderPicker.FileTypeFilter.Add("*");
    StorageFolder pickedFolder = await folderPicker.PickSingleFolderAsync();
    var allFiles = Directory.EnumerateFiles(pickedFolder.Path, "*.*", SearchOption.AllDirectories).ToList();

我制作了一个使用GetFilesAsync()GetFolderAsync()函数的方法,但它并不像Directory.EnumerateFiles()

那么快
 private async Task GetFilesInFolders(ObservableCollection<string> list, StorageFolder parent)
    {
        foreach (var file in await parent.GetFilesAsync())
        {
            list.Add(file.Path);
        }
        foreach (var folder in await parent.GetFoldersAsync())
        {
            await GetFilesInFolders(list, folder);
        }
    }

为什么Directory.EnumerateFiles()会返回0个文件?

1 个答案:

答案 0 :(得分:2)

与传统的桌面应用程序不同,UWP运行沙盒并且对文件系统的访问权限非常有限。

默认情况下,UWP只能访问其本地文件夹,如LocalFolder / InstallationFolder ...或应用程序创建的用户下载文件夹中的文件和文件夹,如果应用程序需要访问其他文件,我们可能需要使用功能或文件选择器。有关详细信息,请参阅File access permissions

  

为什么Directory.EnumerateFiles()会返回0个文件?

如果selectedFolder不在应用程序的本地文件夹中,则使用pickedFolder.Path,UWP应用程序无法直接访问该文件夹。如果您从应用程序的本地文件夹中选择该文件夹,您的代码将正常运行。

此外,使用UWP中的路径可能不是一个好习惯,它不适用于像音乐库,视频库等的KnowFolders。有关详细信息,请参阅Rob的博客:Skip the path: stick to the StorageFile

建议使用文件夹选择器让用户选择文件夹并将其添加到您应用的FutureAccessListMostRecentlyUsedList,这样可以在以后重新加载无需用户通过选择器。有关详细信息,请查看:How to track recently-used files and folders