【发布时间】:2018-03-13 09:09:12
【问题描述】:
我是一位相当有经验的开发人员,但这让我在 UWP 中遇到了困难 - 我会保持简单。
假设我要浏览图片文件夹中的所有照片,为它们加水印,并将加水印的版本保存在图片的子文件夹中(例如图片\水印)
听起来容易吗?
尝试 1: 使用 GetFilesAsync(包括 GetItemsAsync、GetFoldersAsync)- 此方法遍历每个文件,为我提供所需的 StorageFile 对象。
这种方法有两个问题:
在我扫描完所有文件后才能显示进度条 在 UWP 中速度非常慢。
如果我保留任何引用,运行时代理将消耗所有内存 到 StorageFile 对象(因此枚举并再次枚举以获得 进度很慢,想想比Win32慢1000倍)
尝试 2: 使用查询 - 此方法涉及使用 Windows.System.Search 和查询返回指向所有文件的指针列表 (ish)。然后,我可以使用 StorageFolderQueryResult 动态获取每个 StorageFile 并立即释放,以便运行时代理运行。这非常快,因为它使用 Windows 索引系统,非常非常快。
问题是查询系统相当愚蠢,一旦我创建了子文件夹“Watermarked Photos”,查询返回的存储文件(查询时不存在)开始包含Watermarked文件夹中的文件。看起来查询实际上只是一些文件,而不是实际文件的静态列表,因此根据在其范围内调用查询后添加/删除的任何文件,结果是任意的。
有人对如何做到这一点有想法吗?
【问题讨论】:
-
获取开始查询的时间,然后搜索在开始时间之前更改的文件。仍然不是 100%,但稍微好一点。
-
谢谢,这可以通过 Changed Event 和时间来实现,但是,扫描 10,000 个文件以查看哪些是新文件需要很长时间,即使在 SSD 上可能需要 10 分钟:(
-
是否就像将初始查询结果写入本地列表对象,然后通过它而不是直接查询来枚举一样简单?
-
不幸的是,存储结果意味着 Windows 运行时代理将杀死系统,消耗所有内存,并使窗口停止运行。
-
“我无法显示进度条”我能知道这是什么意思吗?进度条控件是干什么用的? “如果我保留对 StorageFile 的任何引用”您是否同时引用了 10000?您如何监控内存消耗?
标签: c# vb.net uwp enumerate storagefile