You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过函数调用查找路径中间含通配符的目录?

如何匹配路径中间含通配符的目录(.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\MultiParts01
  • C:\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:03:28