UWP 在创建子文件夹时枚举包含 10,000 个文件的文件夹

UWP Enumerate Folders with 10,000 files while creating a subfolder

我是一个相当有经验的开发人员,但这让我在 UWP 中遇到了困难 - 我会保持简单。

假设我想浏览图片文件夹中的所有照片,为它们加水印,并将加水印版本保存在图片的子文件夹中(例如 pictures\watermarked)

听起来很简单?

尝试 1: 使用 GetFilesAsync(包括 GetItemsAsync、GetFoldersAsync)- 此方法遍历每个文件,为我提供所需的 StorageFile 对象。

这种方法有 2 个问题:

  1. 在扫描完每个文件之前我无法显示进度条 在 UWP 中非常慢。

  2. 如果我保留任何引用,Runtime Broker 将消耗所有内存 到 StorageFile 对象(因此再次枚举和枚举以获得 进展严重缓慢,认为比 Win32 慢 1,000 倍)

尝试 2: 使用查询 - 此方法涉及使用 Windows.System.Search & 查询 return 指向所有文件的指针列表。然后,我可以使用 StorageFolderQueryResult 即时获取每个 StorageFile 并立即释放,以便运行时代理运行。这非常快,因为它使用 Windows 索引系统,真的非常快。

问题是查询系统相当愚蠢,一旦我创建了子文件夹"Watermarked Photos",由查询编辑的存储文件return(查询时不存在)开始包含 Watermarked 文件夹中的文件。看起来查询实际上只是一些文件,而不是实际文件的静态列表,因此在其范围内调用查询后,结果基于任何文件是任意的added/removed。

有人想知道如何做到这一点吗?

已解决 - 无法使用索引系统。我创建了自己的查询 class。它使用文件夹的 GetItemsAsync 方法,这里的对象数量不会杀死 RuntimeBroker,我将 Path 存储在字符串列表中。包含所有文件和子文件夹的路径。然后我可以使用 GetFileFromPathAsync 根据需要实例化和销毁 StorageItems。 RuntimeBroker 对此没有问题,虽然它不是最好的性能,但它确实为我提供了自定义 file/folder 过滤。如果有人需要更多信息,我们很乐意详细说明。