2008-12-19 66 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"); 
相關問題