关于UWP(Broad File System Access)的文件搜索API咨询
在UWP的Broad File System Access权限下搜索文件名的方案
嘿,刚好对这块有研究!当你的UWP应用开启了**Broad File System Access(BFSA)**权限后,确实有几种靠谱的方式实现按文件名搜索文件的需求,我给你拆解下常用的两种方案:
方案一:基于StorageFolder的本地文件搜索
这是最直接的方式,利用UWP的StorageFolder和QueryOptionsAPI,可以灵活指定搜索范围、深度和匹配规则,完全适配BFSA的权限场景。
步骤说明:
- 首先确保你的应用已经在
Package.appxmanifest中声明了broadFileSystemAccess权限,并且用户已经在Windows设置的「隐私和安全性→文件系统」里给应用授权了文件系统访问权限。 - 获取你要搜索的目标文件夹(BFSA允许你直接通过路径获取任意本地文件夹)。
- 创建查询选项,设置搜索关键词、深度和文件类型过滤。
代码示例:
// 替换成你要搜索的目标文件夹路径 string targetFolderPath = @"C:\Users\YourName\Documents"; StorageFolder targetFolder = await StorageFolder.GetFolderFromPathAsync(targetFolderPath); // 构建查询:深层搜索所有子文件夹,匹配包含"report"的文件名 QueryOptions queryOptions = new QueryOptions(CommonFileQuery.DefaultQuery, new[] { "*" }) { FolderDepth = FolderDepth.Deep, // 设为Shallow则只搜索当前文件夹 UserSearchFilter = "*report*" // 支持通配符:*匹配任意字符,?匹配单个字符 }; // 执行查询并获取结果 StorageFileQueryResult queryResult = targetFolder.CreateFileQueryWithOptions(queryOptions); IReadOnlyList<StorageFile> matchingFiles = await queryResult.GetFilesAsync(); // 遍历处理找到的文件 foreach (var file in matchingFiles) { Debug.WriteLine($"找到文件:{file.Name},路径:{file.Path}"); }
特点:
- 无需依赖Windows搜索索引,直接遍历文件系统,结果实时准确。
- 可以灵活控制搜索深度(仅当前文件夹/包含子文件夹)。
- 支持通过
UserSearchFilter设置复杂的文件名匹配规则,比如*.docx搜索所有Word文档,2024_*.pdf搜索2024年开头的PDF文件。
方案二:利用Windows Search的ContentIndexer API
如果你需要跨多个驱动器、海量文件的快速搜索,或者要结合文件内容搜索,Windows Search的ContentIndexer会更高效——它基于系统的搜索索引,速度更快,但需要确保索引已经更新(可能有轻微延迟)。
代码示例:
ContentIndexer indexer = ContentIndexer.GetIndexer(); // 构建搜索查询:匹配文件名包含"invoice"的文件 string queryText = "filename:*invoice*"; IIterable<IndexedContentItem> results = await indexer.QueryAsync(queryText, null); foreach (var item in results) { // 通过索引项的ID获取对应的StorageFile try { StorageFile file = await StorageFile.GetFileFromPathAsync(item.ItemId); Debug.WriteLine($"找到文件:{file.Name},路径:{file.Path}"); } catch (FileNotFoundException) { // 文件可能已被删除或移动,索引未更新 Debug.WriteLine($"索引中的文件已不存在:{item.ItemId}"); } }
注意事项:
- 该API依赖Windows系统的搜索服务,需要确保系统搜索功能正常启用。
- 对于刚创建或修改的文件,索引可能需要几秒到几分钟的时间才能更新,实时性不如方案一。
额外提示
- 如果只需要搜索特定类型的文件,可以在
QueryOptions的第二个参数中指定文件扩展名,比如new[] { ".txt", ".xlsx" },这样会只返回对应类型的文件,减少搜索范围。 - BFSA权限仅支持本地文件系统和可移动存储,无法直接搜索网络共享文件夹,如需访问网络路径,需要使用
Windows.Storage.AccessCache或其他网络文件API。
内容的提问来源于stack exchange,提问作者Saravana Kumar
相关产品推荐
相关产品推荐

