.net 应用程序是否有通配符扩展选项?
题
我用过 用于扩展通配符参数的 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");