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

时间:2015-09-19 13:31:32

标签: c# windows-runtime win-universal-app windows-10

StorageFolder.GetFilesAsync速度非常慢:

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

回到Windows Phone 8.0 Silverlight,我能够更快地获取CameraRoll的内容(通过MediaLibrary):

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

是否有可能加快GetFilesAsync的速度,或者有没有办法获取文件夹的文件?

我需要照片文件立即提取地理标记 DateTaken 等信息。您可以看到他们在我的应用GeoPhoto中加载Silverlight的速度有多快 - 我现在正试图移植到UWP。我已经实现了缓存(使用图片路径映射地理标记和DateTaken),因此我只需要后续应用启动的图片路径。然后可以在稍后(长GetFilesAsync - 调用之后)显示尚未缓存的照片,但是在他启动应用程序之后立即向用户提供他可以与之交互的内容非常重要。

2 个答案:

答案 0 :(得分:0)

我想知道你是否读过这个: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.1上   XAML你应该使用StorageFolder.GetFileAsync,并在Windows 8.1上使用   新方法StorageFolder.TryGetItemAsync。 不要使用迭代   StorageFiles从StorageFolder.GetFilesAsync返回任何   平台,它非常慢。此外,如果你不需要继续   在原始线程中,您可以在WP8.1上使用同步替代方案   XAML,Windows 8和Windows 8.1平台。

或类似的东西?

StorageFolder.GetItemsAsync(UInt32, UInt32) 

获取第一个X数量的文件,以便为用户提供您想要的即时反馈。之后加载剩下的。

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

答案 1 :(得分:0)

编辑:由于我的原始答案似乎没有帮助,我希望这个答案与您的问题相符。

我创建了一个包含~4000个文件的文件夹,仅用于测试并使用秒表来占用时间 只需阅读文件夹中的每个项目即可:

  

System.IO.Directory.GetFiles() 0.2秒

     

Windows.Storage.StorageFolder.GetFilesAsync ~5.5秒

执行多次和不同的次序

据我所知,这只是将文件名作为字符串给出,但根据您用来阅读图片的库,这可能对您有所帮助。

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

它还允许您传递一个searchPattern,它允许您使用像*和这样的占位符,并且它可以同步工作,但通过此方法检索文件的工作非常快。