我想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# 示例代码。