1

.NET 4.5 と C# を使用しています。スペルが大文字と小文字を区別する場合、以下のコードは正常に機能します。つまり、ファイルのスペルが「SetupV8.exe」とまったく同じである場合です。しかし、大文字と小文字を区別しないようにする必要があります。私はそれで遊んでいますが、方法を見つけることができません。

foreach (string file in directory.EnumerateFiles((AppDomain.CurrentDomain.BaseDirectory),  
         "*.exe", SearchOption.AllDirectories))
{
   if (!file.Contains("SetupV8.exe")
   {    
      // Do something
   }
}

ありがとう

4

6 に答える 6

10

string.Containsは、NET ソースからわかるように、 string.IndexOfの単なるラッパーです。

public bool Contains(string value)
{
    return (this.IndexOf(value, StringComparison.Ordinal) >= 0);
}

string.IndexOf には、検索する文字列の大文字と小文字を区別しない適切なパラメーターがあります。

 if (file.IndexOf("SetupV8.exe", StringComparison.OrdinalIgnoreCase) >= 0)
     // File found

StringComparison 列挙型

于 2012-11-17T19:55:33.100 に答える
2

MSDN の記事に従って、StringComparison.OrdinalIgnoreCase大文字と小文字を区別せずに比較する ことができます。

file.name.Contains("SetupV8.exe", StringComparison.OrdinalIgnoreCase)

プロセスで2つの変更可能な文字列を作成しないため、これはより効率的であり、私の意見では、使用するよりもきれいに見えます.toLower()

ただし、ここでチェックしていることを考慮する必要があります。ファイル ハッシュの方が優れているでしょうか。ファイルの内容がわかっていると想定している場合、セキュリティ上の問題が発生している可能性があります。

于 2012-11-17T19:55:53.833 に答える
2

拡張子を含むがディレクトリを含まないファイル名全体を比較する場合:

file.Name.Equals(fileNameAndExt, StringComparison.OrdinalIgnoreCase)

file.FullNameディレクトリ名も含まれます。StringComparison.OrdinalIgnoreCase文化固有の処理を適用しないため、最速の比較方法です。ファイルシステムもそうしないので、これは正しい方法です。

于 2012-11-17T20:00:29.037 に答える
0

比較のために、文字列をすべて小文字に強制します。

file.ToLower().Contains("setupv8.exe")
于 2012-11-17T19:48:44.673 に答える
0

file.ToLower().Contains("setupv8.exe")通常は正常に動作します。(代わりにEndsWithを検討することをお勧めします)

また、EnumerateFilesreturnsなので、代わりにそのプロパティをFileInfo確認することもできます。Name

foreach (FileInfo file in directory.EnumerateFiles((AppDomain.CurrentDomain.BaseDirectory),  
         "*.exe", SearchOption.AllDirectories))
{
   if (!file.Name.ToLower().Contains("setupv8.exe")
   {    
      // Do something with file
   }
}

また、名前「SetupV8.exe」であり、接頭辞/接尾辞が付いているとは思わない場合は、この時点で等しいかどうかを確認してください。

編集:おそらくもっと重要なのは、おそらくファイル名だけを使用したいということです。ディレクトリパスのいずれかの部分が一致するかどうかを確認する場合を除きます。つまりc:\temp\setupv8.exe_directory\subdirectory\setupv8.exe、誤検知として一致させたくない場合があります。

ToLower() 8年後の新しい読者のための編集:使用すると予期しない結果が生じる可能性があるエッジケースがいくつかあるため、ToLowerInvariant()代わりに使用する方が望ましい場合があります。

于 2012-11-17T19:51:49.460 に答える
0

拡張メソッドを作るだけ

public bool Contains(this string my,string his)
 {
      return my.ToLower().Contains(his.ToLower());
 }

利用方法

....
if(file.Contains("SetupV8")) // the case is ignored !
....
....
于 2012-11-17T19:59:44.547 に答える