1

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

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

听起来容易吗?

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

这种方法有两个问题:

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

  2. 如果我保留对 StorageFile 对象的任何引用,运行时代理将消耗所有内存(因此枚举并再次枚举以获取进度非常慢,认为比 Win32 慢 1,000 倍)

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

问题是查询系统相当愚蠢,一旦我创建了子文件夹“Watermarked Photos”,查询返回的存储文件(查询时不存在)开始包含 Watermarked 文件夹中的文件。看起来查询实际上只是一些文件,而不是实际文件的静态列表,因此根据在其范围内调用查询后添加/删除的任何文件,结果是任意的。

有人对如何做到这一点有想法吗?

4

1 回答 1

0

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

于 2017-10-26T09:21:39.073 回答