我是一位经验丰富的开发人员,但这让我难以接受UWP - 我会保持简单。
我想说我想浏览图片文件夹中的所有照片,给它们添加水印,并将水印版本保存在图片的子文件夹中(例如图片\水印)
声音容易吗?
尝试1:使用GetFilesAsync(包括GetItemsAsync,GetFoldersAsync) - 此方法遍历每个文件,为我提供所需的StorageFile对象。
这种方法存在两个问题:
在我扫描每个文件之前,我无法显示进度条。 在UWP中痛苦地缓慢。
如果我保留任何引用,Runtime Broker将消耗所有内存 到StorageFile对象(所以再次枚举和枚举得到一个 进度非常慢,比Win32慢1000倍
尝试2:使用查询 - 此方法涉及使用Windows.System.Search&查询返回所有文件的指针列表(ish)。然后,我可以使用StorageFolderQueryResult来动态获取每个StorageFile并立即释放,以便Runtime Broker运行。这非常快,因为它使用Windows索引系统,非常非常快。
问题是查询系统是相当愚蠢的,因为我创建子文件夹"水印照片",查询返回的存储文件(查询时不存在)开始包含文件来自Watermarked文件夹。看来Query实际上只是一些文件,而不是实际文件的静态列表,因此根据在其范围内调用查询后添加/删除的任何文件,结果是任意的。
有关于如何做到这一点的人?
答案 0 :(得分:0)
已解决 - 使用索引系统是不可能的。我创建了自己的Query类。它使用文件夹的GetItemsAsync方法,这里的对象数量不会杀死RuntimeBroker,我将Path存储在字符串列表中。包含所有文件和子文件夹的路径。然后,我可以根据需要使用GetFileFromPathAsync来实例化和销毁StorageItems。 RuntimeBroker是可以的,虽然它不是最好的性能它给我自定义文件/文件夹过滤。很高兴详细说明是否有人需要更多信息。