【问题标题】:UWP Enumerate Folders with 10,000 files while creating a subfolderUWP 在创建子文件夹时枚举包含 10,000 个文件的文件夹
【发布时间】:2018-03-13 09:09:12
【问题描述】:

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

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

听起来容易吗?

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

这种方法有两个问题:

  1. 在我扫描完所有文件后才能显示进度条 在 UWP 中速度非常慢。

  2. 如果我保留任何引用,运行时代理将消耗所有内存 到 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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-12-25
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 2015-09-14
    • 1970-01-01
    相关资源
    最近更新 更多