【问题标题】:Faster way to get files of a folder than StorageFolder.GetFilesAsync()?获取文件夹文件比 StorageFolder.GetFilesAsync() 更快的方法?
【发布时间】:2015-12-16 14:16:40
【问题描述】:

StorageFolder.GetFilesAsync 非常慢:

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

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

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

我需要照片文件来立即提取信息,例如 Geotag 或 DateTaken。您可以在我的应用程序GeoPhoto 中看到他们加载 Silverlight 的速度有多快 - 我现在正尝试将其移植到 UWP。我已经实现了缓存(使用图片路径映射地理标签和 DateTaken),所以我只需要图片路径来启动后续应用程序。尚未缓存的照片可以稍后显示(在长时间的GetFilesAsync-call 之后),但重要的是在用户启动应用后立即为他提供可以与之交互的内容。

【问题讨论】:

  • 你试过Windows.Storage.BulkAccess命名空间吗? FileInformationFactory.GetFilesAsync 和 FileInformationFactory.GetVirtualizedFilesVector 可能更快。
  • @RaymondChen - 我刚刚尝试了 FileInformationFactory.GetFilesAsync 方法,看看它是否更快,因为我以前从未使用过它......在一个蹩脚的例子中,我烘焙了 10500 个文件,它是 45- 60 秒返回,类似于StorageFolder.GetFilesAsync 次。
  • 您的文件夹是否在索引位置(如图书馆)?如果没有,那么别无选择,只能打磁盘。另外,你试过GetVirtualizedFilesVector吗?我的猜测是,虚拟化向量的前期工作较少,因为它可以懒惰地生成内容。
  • @tipa 您能否为您的用例添加要求?您是否需要将目录中的所有文件显示在列表中?或者您是否需要它们在您的代码中并搜索文件。这些细节可能有助于找到解决方案。
  • @Herdo 我已经为我的用例添加了要求。希望它有助于找到解决方案。

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


【解决方案1】:

编辑:由于我最初的回答似乎没有帮助,我希望这个回答能解决你的问题。

我创建了一个包含约 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,它允许您使用 * 和 ? 之类的占位符,并且它可以同步工作,但是通过这种方法检索文件非常快。

【讨论】:

  • 这个问题不仅是老问题,而且对速度不足的问题也相当清楚。你的回答如何解决这个问题?
【解决方案2】:

我想知道你是否读过这篇文章: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。 不要使用迭代 从 StorageFolder.GetFilesAsync 返回的 StorageFiles 平台,速度非常慢。另外,如果您不需要合作,请继续 原始线程,您可以在 WP8.1 上使用同步替代方案 XAML、Windows 8 和 Windows 8.1 平台。

还是这样的?

StorageFolder.GetItemsAsync(UInt32, UInt32) 

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2021-01-01
    • 2021-07-24
    • 2010-09-06
    • 1970-01-01
    相关资源
    最近更新 更多