.net アプリ用のワイルドカード拡張オプションはありますか?
質問
私が使用したのは、 ワイルドカード引数を展開するための setargv.obj リンク 過去には多くの C および C++ アプリについて言及されていましたが、.net アプリケーションについては同様の言及が見つかりません。
ありますか 標準 アプリのコマンドラインパラメータを自動的にワイルドカード展開させる方法はありますか? (すなわち、*.doc を args パラメータ内の 1 つのエントリから、そのワイルドカードに一致するすべてのエントリに展開します)。
追伸現在の小さなプロジェクトで 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
}
}
}
解決
あなたのコードは正確にあなたがそれを行うことになっているかのように見えます。
他のヒント
ここでは、私たちに私ラフハック。それは再帰的であるために、私は大好きです。そして、私はむしろ私のためにそれを行う)(GetFilesをさせるよりも、正規表現を使用することを決めるかもしれません、Windowsのワイルドカードの欠点を経験した。
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で行っている場所を取得する場合()はこのような何かがうまくいくかもしれない、あなたが言及した「ハック」ます:
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)));
あなたがWindowsフォルダに含まれるすべてのディレクトリをつかむことができます呼び出しGetDirectoriesにワイルドカードオプション[直接]「のSYS *」パターンにマッチする。
あなたは、パターン「* .SYS」に一致するすべてのファイルをつかんでこれらのフォルダを反復処理することができます。
の事のようなものが、あなたが探しているということですか?自動的に引数を展開するには、あなたが有意義な方法のいくつかの種類にワイルドカードを抽出し、そのモデルに適用する必要があると思います...
たとえばます:
RunMyApp "C:\ WINDOWS \のSys * \ * .SYS"
ワイルドカードを含めると、検索パラメータとしてワイルドカードの文字列を取り付け、GetDirectoriesメソッドに適用されません最低レベルのディレクトリを見つけ、おそらく正規表現で - \ Windowsの場合:あなたは、文字列Cを引き出したいです。
次にDirectory.GetFilesのための検索パターンとして(この場合は* .SYS)、文字列のあなたのEND IFます。
あなたがより複雑になりたかったとような何かを行う場合:
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");