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只是string.IndexOf的包装,正如您从 NET 源代码中看到的那样

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

并且 string.IndexOf 有一个适当的参数来忽略要搜索的字符串的大小写

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

字符串比较枚举

于 2012-11-17T19:55:33.100 回答
2

根据MSDN 文章,无论大小写如何, 您都可以传入StringComparison.OrdinalIgnoreCase进行比较。

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

这将更有效,因为您不会在此过程中创建两个可变字符串,并且我认为看起来比使用更干净.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 )

此外,由于EnumerateFiles返回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匹配为误报。

8 年后为新读者编辑:在某些极端情况下 usingToLower() 可能会引入一些意想不到的结果,因此也许改用它可能更可取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 回答