在我的控制台应用程序中,我使用
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个文件?
答案 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。
建议使用文件夹选择器让用户选择文件夹并将其添加到您应用的FutureAccessList或MostRecentlyUsedList,这样可以在以后重新加载无需用户通过选择器。有关详细信息,请查看:How to track recently-used files and folders。