4

操作目的で無視する必要があるファイルを含む文字列のリストがあります。ですから、ワイルドカードが入っている状況をどのように処理するかが気になります。

たとえば、文字列のリストで可能な入力は次のとおりです。

C:\Windows\System32\bootres.dll
C:\Windows\System32\*.dll

最初の例は扱いやすいと思います。ファイルが一致するかどうかを確認するには、文字列の等号チェック (大文字と小文字を区別しない) を実行するだけです。ただし、指定されたファイルがリスト内のワイルドカード式と一致するかどうかを判断する方法がわかりません。

私がやっていることの背景を少し。ユーザーはある場所との間でファイルをコピーできますが、ファイルが文字列のリスト内のファイルと一致する場合、コピーを許可したくありません。

これを処理するには、より良いアプローチが必要になる場合があります。

除外したいファイルは構成ファイルから読み込まれ、コピーしようとしているパスの文字列値を受け取ります。タスクを完了するために必要なすべての情報を持っているように見えます。それは、最善のアプローチが何であるかの問題です。

4

2 に答える 2

2
IEnumerable<string> userFiles = Directory.EnumerateFiles(path, userFilter);

// a combination of any files from any source, e.g.:
IEnumerable<string> yourFiles = Directory.EnumerateFiles(path, yourFilter);
// or new string[] { path1, path2, etc. };

IEnumerable<string> result = userFiles.Except(yourFiles);

セミコロンで区切られた文字列を解析するには:

string input = @"c:\path1\*.dll;d:\path2\file.ext";

var result = input.Split(";")
                  //.Select(path => path.Trim())
                  .Select(path => new
                  {
                      Path = Path.GetFullPath(path), //  c:\path1
                      Filter = Path.GetFileName(path) // *.dll
                  })
                  .SelectMany(x => Directory.EnumerateFiles(x.Path, x.Filter));
于 2012-06-06T17:35:16.083 に答える
1

Directory.GetFiles()パスのファイル名を使用して、一致するファイルがあるかどうかを確認できます。

string[] filters = ...
return filters.Any(f => 
    Directory.GetFiles(Path.GetDirectoryName(f), Path.GetFileName(f)).Length > 0);

更新:
私は確かに完全に間違っていました。ワイルドカード文字を含む一連のファイル フィルターがあり、これらに対してユーザー入力をチェックしたいと考えています。コメントで @hometoast が提供するソリューションを使用できます。

// Configured filter:
string[] fileFilters = new [] 
{ 
  @"C:\Windows\System32\bootres.dll", 
  @":\Windows\System32\*.dll" 
}

// Construct corresponding regular expression. Note Regex.Escape!
RegexOptions options = RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase;

Regex[] patterns = fileFilters
  .Select(f => new Regex("^" + Regex.Escape(f).Replace("\\*", ".*") + "$", options))
  .ToArray(); 

// Match against user input:
string userInput = @"c:\foo\bar\boo.far";
if (patterns.Any(p => p.IsMatch(userInput)))
{ 
  // user input matches one of configured filters
}
于 2012-06-06T17:30:44.153 に答える