Directory.EnumerateFiles 在 UWP 中返回 0 个文件
Posted
技术标签:
【中文标题】Directory.EnumerateFiles 在 UWP 中返回 0 个文件【英文标题】:Directory.EnumerateFiles returns 0 files in UWP 【发布时间】:2017-06-28 20:46:42 【问题描述】:在我的控制台应用程序中,我使用
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个文件?
【问题讨论】:
您确定directoryPath
和pickedFolder.Path
相同吗?您是否尝试过用相同的硬编码字符串替换两者来排除这种情况?
@RufusL 是的,我试过了,还是 0 :(
【参考方案1】:
与传统的桌面应用程序不同,UWP 以沙盒方式运行,并且对文件系统的访问权限非常有限。
默认情况下,UWP 只能访问其本地文件夹,如 LocalFolder/InstallationFolder... 或您的应用创建的用户下载文件夹中的文件和文件夹,如果应用需要访问其他文件,我们可能需要使用功能或文件选择器。更多信息请查看File access permissions
为什么 Directory.EnumerateFiles() 返回 0 个文件?
如果pickFolder 不在应用的本地文件夹中,则UWP 应用无法使用pickFolder.Path 直接访问该文件夹。如果您从应用程序的本地文件夹中选择文件夹,您的代码将正常工作。
此外,在 UWP 中使用路径可能不是一个好习惯,它也不适用于音乐库、视频库等 KnownFolders。更多信息请参考 Rob 的博客:Skip the path: stick to the StorageFile。
推荐使用FolderPicker让用户选择文件夹并将其添加到您的应用程序的FutureAccessList或MostRecentlyUsedList,这样以后可以重新加载它们而无需用户通过选择器。欲了解更多信息,请查看:How to track recently-used files and folders。
【讨论】:
我之所以问这个问题是因为 Directory.EnumerateFiles() 与 GetFilesAsync() 相比有多快。那么有没有一种方法可以获得相同的性能但使用 UWP 功能之一?以上是关于Directory.EnumerateFiles 在 UWP 中返回 0 个文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 Directory.EnumerateFiles 显示文件名
X509Certificate2.Verify()行为首次使用