我用过 用于扩展通配符参数的 setargv.obj 链接 过去,对于许多 C 和 C++ 应用程序,我找不到任何类似的 .net 应用程序提及。

有没有 标准 如何让应用程序的命令行参数自动扩展通配符? (IE。将 *.doc 从 args 参数中的一个条目扩展到所有与该通配符匹配的条目)。

附:我已经为我当前的小项目与 Directory.GetFiles() 一起破解了一些东西,但它还没有覆盖带有路径的通配符,并且如果没有自定义代码就可以做到这一点会很好。

更新: 这是我的粗略技巧,用于说明。它需要拆分 GetFiles 的路径和名称参数,但这是总体思路。将 setargv.obj 链接到 C 或 C++ 应用程序基本上会执行所有通配符扩展,让用户仅迭代 argv 数组。


static void Main(string[] args)
{
    foreach (String argString in args)
    {
        // Split into path and wildcard
        int lastBackslashPos = argString.LastIndexOf('\\') + 1;
        path = argString.Substring(0, lastBackslashPos);
        filenameOnly = argString.Substring(lastBackslashPos, 
                                   argString.Length - lastBackslashPos);

        String[] fileList = System.IO.Directory.GetFiles(path, filenameOnly);
        foreach (String fileName in fileList)
        {
            //do things for each file
        }
    }
}
有帮助吗?

解决方案

您的代码看起来完全符合您的预期。

其他提示

这是我的粗略技巧。我希望它是递归的。在经历了 Windows 通配符的缺点之后,我可能会决定使用正则表达式,而不是让 GetFiles() 为我做这件事。

using System.IO;

public static string[] ExpandFilePaths(string[] args)
{
    var fileList = new List<string>();

    foreach (var arg in args)
    {
        var substitutedArg = System.Environment.ExpandEnvironmentVariables(arg);

        var dirPart = Path.GetDirectoryName(substitutedArg);
        if (dirPart.Length == 0)
            dirPart = ".";

        var filePart = Path.GetFileName(substitutedArg);

        foreach (var filepath in Directory.GetFiles(dirPart, filePart))
            fileList.Add(filepath);
    }

    return fileList.ToArray();
}

我不确定你到底在追求什么......但如果我通过你提到的 Directory.GetFiles() “hack” 到达你要去的地方,那么这样的事情可能会起作用:

var Dirs = Directory.GetDirectories(@"C:\Windows", "sys*", 
SearchOption.TopDirectoryOnly).ToList();
var Files = new List<String>();
Dirs.ForEach(dirName => Files.AddRange(Directory.GetFiles(dirName, "*.sys", SearchOption.AllDirectories)));

GetDirectories 调用中的通配符选项将允许您[直接]获取 Windows 文件夹中包含的所有与模式“sys*”匹配的目录。

然后,您可以迭代这些文件夹,获取与模式“*.sys”匹配的所有文件。

这是您正在寻找的东西吗?要自动扩展参数,您必须以某种有意义的方式提取通配符并将它们应用于该模型......

例如:

RunMyApp“C:\Windows\Sys*\ *.sys”

您可以提取字符串 C:\Windows - 可能使用正则表达式,找到不包含通配符的最低级别目录并将其应用于 GetDirectories 方法,将通配符字符串附加为搜索参数。

然后,如果您将字符串结尾(在本例中为 *.sys)作为 Directory.GetFiles 的搜索模式。

如果你想变得更复杂并做类似的事情:

C:\Windows\*\Sys*\*.sys

您可以使用 SearchOptions 来设置此行为:

Directory.GetDirectories(@"C:\Windows", "sys*", SearchOptions.AllDirectories)

这将获取 Windows 目录中与 sys* 通配符匹配的所有目录及其下面的所有目录。

如果你想变得比这更复杂,那么我不确定你会怎么做......例如,假设您想要直接包含在 Windows 目录中的文件夹中的文件夹 - 恐怕我不知道您会如何处理类似的事情...我不想象将整个树结构导出为 XML 并使用 XPath 来做到这一点会非常高效 - 使用通配符解析 XPath 会非常简单 - 但转换为 XML 就不会那么高效了......

请参阅Microsoft.build.dll中拆卸的Microsoft.build.shared.fileMatcher类的源代码,您可以从方法GetFiles的实现中获得一些想法。

作为客户您可以使用以下方法

var filelist = FileMatcher.GetFiles(@"c:\alaki",@"c:\alaki\**\bin\*.dll");
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top