2008-12-19 22 views
15

我在过去曾使用过setargv.obj linking for Expanding Wildcard Arguments来处理大量的C和C++应用程序,但是我找不到任何类似的.net应用程序。.net应用程序是否有通配符扩展选项?

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

P.S.我已经用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 
     } 
    } 
} 
+0

通过使用该方法的客户你的意思是,不仅通配符文件名,但通配符文件夹名称吗?例如:C:\ Windows \ System32 \ * \ Test * .doc? – BenAlabaster 2008-12-19 16:09:38

+0

“原始”setargv.obj只能在文件名中使用通配符,所以这就是我要找的。 – crashmstr 2008-12-19 16:46:10

+0

根本看起来不像黑客,它看起来很直截了当。 – 2008-12-23 00:51:01

回答

1

你的代码看起来像你应该这样做。

4

我不知道你后到底是什么......但如果我得到你正在与Directory.GetFiles去()“黑客”你提到的,那么这样的事情可能工作:

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”的文件。

这是你要找的那种东西吗?要自动展开args,你必须提取通配符在某种有意义的方式,并将其应用到模型......

例如:

RunMyApp“C:\ WINDOWS \ SYS * \ * .sys“

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

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

如果你想获得更多的复杂,这样做:

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

您将使用SearchOptions来设置此行为:

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

这会抓住匹配的SYS所有目录* Windows目录中的通配符和它下面的所有目录。

如果你想得到比这更复杂的,那么我不知道你会如何做到这一点...例如,假设你想要文件夹中包含的文件夹直接在Windows目录中 - 我没有想法你怎么会去那样的事情,我很害怕...我不认为将整个树结构导出为XML并使用XPath来完成它将非常高效 - XPath对使用通配符进行解析非常简单 - 但转换为XML将不会如此高效......

9

在这里,我们粗糙的黑客。我很喜欢它是递归的。并且经历了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(); 
} 
3

看到拆解Microsoft.Build.Shared.FileMatcher类的源代码Microsoft.Build.dll 你可以从方法的GetFiles实现的一些想法。

,你可以按照如下

var filelist = FileMatcher.GetFiles(@"c:\alaki",@"c:\alaki\**\bin\*.dll"); 
相关问题