获取文件夹文件的速度比StorageFolder.GetFilesAsync()更快

本文关键字:GetFilesAsync 更快 StorageFolder 文件夹 文件 速度 获取 | 更新日期: 2023-09-27 18:13:23

StorageFolder.GetFilesAsync速度慢得令人难以置信:

  • 对于包含约3500个文件的文件夹,约7秒

回到WindowsPhone8.0Silverlight,我能够更快地获得CameraRoll的内容(通过MediaLibrary(:

  • <对于相同数量的文件,1秒

有没有可能加快GetFilesAsync的速度,或者有没有其他方法可以获取文件夹中的文件?

我需要照片文件来立即提取信息,如地理标签日期拍摄。你可以在我的应用程序GeoPhoto中看到他们加载Silverlight的速度有多快——我现在正试图将其移植到UWP。我已经实现了缓存(用图片路径映射地理标记和DateTake(,所以我只需要图片路径来启动后续的应用程序。还没有缓存的照片可以稍后显示(在长时间的GetFilesAsync-调用之后(,但重要的是,在用户启动应用程序后,立即为他提供一些可以交互的东西。

获取文件夹文件的速度比StorageFolder.GetFilesAsync()更快

我想知道你是否读过这篇文章:https://www.suchan.cz/2014/07/file-io-best-practices-in-windows-and-phone-apps-part-1-available-apis-and-file-exists-checking/

Windows 8.1-最后,在Windows 8.1上,最快的方法是新的StorageFolder.TryGetItemAsync方法,但在与其他方法相比。这里的主要好处肯定是需要简单的代码,如果文件不存在。同步方法的结果与Windows 8类似平台,如果不需要原始同步上下文,则同步方法是一个更好的选择。

简而言之,为了检查目标文件是否存在,在WP8和WP8.1 Silverlight上,最快的方法是file.exists,在Windows 8和WP8.1XAML应该使用StorageFolder.GetFileAsync,在Windows 8.1上使用新方法StorageFolder.TryGetItemAsync.不要使用迭代从任意平台,速度非常慢如果您不需要继续对于原始线程,您可以在WP8.1上使用同步替代方案XAML、Windows 8和Windows 8.1平台。

或者类似的东西?

StorageFolder.GetItemsAsync(UInt32, UInt32) 

获取第一个X数量的文件,以便立即向用户提供您想要的反馈。之后加载其余部分。

https://msdn.microsoft.com/en-us/library/windows/apps/br227287.aspx

编辑:由于我最初的答案似乎没有帮助,我希望这个答案能与您的问题相匹配。

我创建了一个文件夹,里面有大约4000个文件,只是为了测试,并使用了秒表来打发时间
仅阅读文件夹中的每一项就花费了:

System.IO.Directory.GetFiles():0.2秒

Windows.Storage.StorageFolder.GetFilesAsync~5.5秒

多次执行并按不同顺序执行

我知道这只是将文件名作为字符串提供给你,但根据你用来阅读图片的库,这可能仍然会对你有所帮助。

原始答案:
当您将路径作为字符串(例如来自ApplicationData.Current.LocalFolder.Path(时,可以使用System.IO.Directory.GetFiles(string path)。它不返回特定的对象,而是以字符串形式返回路径。您可以将它们与静态类System.IO.File一起使用。

它还允许您传递searchPattern,它允许您使用占位符,如*和并且它是同步工作的,但是通过这种方法检索文件的速度非常快。