UWP在创建子文件夹时

时间:2017-10-02 09:40:01

标签: c# vb.net uwp enumerate storagefile

我是一位经验丰富的开发人员,但这让我难以接受UWP - 我会保持简单。

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

声音容易吗?

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

这种方法存在两个问题:

  1. 在我扫描每个文件之前,我无法显示进度条。 在UWP中痛苦地缓慢。

  2. 如果我保留任何引用,Runtime Broker将消耗所有内存 到StorageFile对象(所以再次枚举和枚举得到一个 进度非常慢,比Win32慢1000倍

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

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

    有关于如何做到这一点的人?

1 个答案:

答案 0 :(得分:0)

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