在 UWP 中检索文件夹中文件大小的快速方法

Tho*_*kow 5 uwp c++-winrt

我想TempState使用下面的代码来汇总应用程序文件夹中的所有文件大小,该代码工作正常。

const auto tempFolder { ApplicationData::Current().TemporaryFolder() };
int64_t size { 0 };

const QueryOptions options { CommonFolderQuery::DefaultQuery };
options.FolderDepth(FolderDepth::Shallow);
options.IndexerOption(IndexerOption::UseIndexerWhenAvailable);
options.SetPropertyPrefetch(PropertyPrefetchOptions::BasicProperties, {});

try
{
    for (auto item : co_await tempFolder.CreateFileQueryWithOptions(options).GetFilesAsync())
    {
        size += (co_await item.GetBasicPropertiesAsync()).Size();
    }

    // do something with the size
}
catch (winrt::hresult_error& err)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

目前,我的文件夹中只有不到 3000 个项目TempState,上面的代码需要 20 秒才能计算文件大小的总和。需要有一种方法来加快速度,对吗?


到目前为止我尝试过的是使用

options.IndexerOption(IndexerOption::OnlyUseIndexerAndOptimizeForIndexedProperties);
Run Code Online (Sandbox Code Playgroud)

但随后GetFilesAsync根本不返回任何文件。


可以采取什么措施来(大幅)提高性能?

Roy*_*SFT -1

IndexerOption.OnlyUseIndexer最好在不返回结果时使用,比等待缓慢的文件操作要好。如果索引器被禁用,系统将返回零结果,但会快速返回,仍然让应用程序对用户做出反应。但在你的场景中,它不适合。

枚举大量文件的推荐方法是使用 GetFilesAsync 上的批处理功能对文件组进行分页,而不是直接立即获取所有文件。正如本文档中提到的:Windows 10 - 使用搜索索引器加速文件操作。您可以查看有关如何实现批处理功能并将其转换为 C++/winrt 的 C# 示例代码。