如何通过函数调用查找路径中间含通配符的目录?
如何匹配路径中间含通配符的目录(.NET Framework 4.6.2)
问题背景
需要获取匹配C:\folder1\folder2\*\nextFolder\lastFolder这类路径中间带通配符的目录,但DirectoryInfo.GetDirectories()仅支持通配符出现在路径的最后一段。尝试用WMI查询时触发InvalidQuery错误,错误信息为德语“Die Anfrage ist ungültig”(请求无效),即使将通配符替换为实际文件夹名仍报错;同时确认@"\\.\ROOT\cimv2"作为ManagementScope的语法是否合规。
现有目标目录:
C:\MESDataTransfer\Csv_Cnc_to_Mes_Prod\job\ABD\MultiParts01C:\MESDataTransfer\Csv_Cnc_to_Mes_Prod\job\BHX500\MultiParts01
问题解析与解决方案
1. WMI语法与查询修正
@"\\.\ROOT\cimv2"的合法性
该语法完全正确:\\.\指代本地计算机,ROOT\cimv2是Windows WMI的标准命名空间,在Windows环境下始终通用,与UTF16编码无关。
查询错误的核心原因
Win32_Directory的Path字段存储格式特殊:前后带反斜杠,内部反斜杠需转义,比如对应C:\MESDataTransfer\...的Path值为\MESDataTransfer\Csv_Cnc_to_Mes_Prod\job\ABD\MultiParts01\,原查询未匹配该格式导致报错。
修正后的WMI代码
var scope = new ManagementScope(@"\\.\ROOT\cimv2"); scope.Connect(); // 显式连接,便于排查权限问题 string[] selectProps = { "Path" }; // 匹配Win32_Directory的Path字段格式:前后带反斜杠,内部用双反斜杠转义 var query = new SelectQuery("Win32_Directory", @"Drive = 'C:' and Path Like '\MESDataTransfer\Csv_Cnc_to_Mes_Prod\job\%\MultiParts01\'", selectProps); using (var searcher = new ManagementObjectSearcher(scope, query)) using (var instances = searcher.Get()) { int nCount = 0; foreach (ManagementObject mo in instances) { // 处理Path字段:去除前后反斜杠,拼接Drive得到完整路径 string pathPart = mo["Path"].ToString().Trim('\\'); string fullPath = $"C:\\{pathPart}"; // Console.WriteLine(fullPath); nCount++; } }
2. 替代方案:遍历+LINQ筛选
如果WMI使用不便,可直接通过目录遍历结合LINQ筛选实现需求,逻辑更直观:
string basePath = @"C:\MESDataTransfer\Csv_Cnc_to_Mes_Prod\job"; // 枚举所有MultiParts01目录,验证其父目录是否属于basePath的直接子目录 var targetDirs = Directory.EnumerateDirectories(basePath, "MultiParts01", SearchOption.AllDirectories) .Where(dir => { var parentDir = Directory.GetParent(dir); var grandparentDir = parentDir != null ? Directory.GetParent(parentDir.FullName) : null; return grandparentDir?.FullName.Equals(basePath, StringComparison.OrdinalIgnoreCase) == true; }); foreach (var dir in targetDirs) { // Console.WriteLine(dir); }
此方案等价于匹配C:\...\job\*\MultiParts01的规则,绕开了DirectoryInfo.GetDirectories()的通配符限制。
补充说明
DirectoryInfo.GetDirectories()的通配符限制是API设计决定的,无法直接突破,必须通过WMI或遍历筛选的方式实现中间通配符匹配。- WMI查询时需确保程序具备足够权限访问
ROOT\cimv2命名空间,否则可能触发权限错误。
内容的提问来源于stack exchange,提问作者Juergen2018
相关产品推荐
相关产品推荐

