【问题标题】:Search for file in c#在 C# 中搜索文件
【发布时间】:2026-01-29 09:35:02
【问题描述】:

我想在 c# 中搜索以字符串开头的文件。 我按照互联网上的代码

string[] dirs = Directory.GetFiles(@"c:\", "c*");

但不是查找"c",而是我想查找包含我创建的字符串的文件(我的意思是文件名,例如 contains.txt 和 contains.pdf 都有“包含”)。这是我的代码

string filetofind;
string[] dirs = Directory.GetFiles(@"c:\", filetofind + "*");

但它只是不起作用,还有其他方法吗?

【问题讨论】:

  • “不工作”是什么意思? filetofind 是什么样的?你说“包含”,所以你的意思可能是"*" + filetofin + "*"。您当前的版本只查找 startfiletofind 的文件。
  • 您是在寻找包含filetofind 的文件names 还是您真正的意思是文件content
  • 我的意思是名字,我试过 filetofind + "*" 并且有一个以该字符串开头的文件,但仍然没有找到
  • @NguyễnNgọcAnh - 那么你没有正确匹配字符。你能发布你正在搜索的文件的实际名称和你正在搜索的文本吗?
  • 是用户输入的字符串。在我的情况下测试它是 696969。我创建了一个文件 696969.txt 但代码不起作用

标签: c#


【解决方案1】:

如果

我想查找文件包含我创建的字符串

表示您要检查文件的内容(不是名称)您必须加载文件,例如(假设stringToFind 没有换行符)

 string[] dirs = Directory
   .EnumerateFiles(@"c:\", "*.txt");              // all txt files (put the right wildcard)
   .Where(file => File                             
      .ReadLines(file)                            // with at least one line
      .Any(line => line.Contains(stringToFind)))  // which contains stringToFind
   .ToArray(); 

编辑:如果您想要包含c 的文件的名称,例如"mycode.txt""Constraints.dat" 等(但不是"demo.com",因为c 在文件的扩展名中);你可以试试*c*.* 通配符:文件名包含c 任何扩展名:

  string[] dirs = Directory
    .GetFiles(@"c:\", $"*{filetofind}*.*");

详细条件的情况下,当标准通配符不够时,只需添加Where

 string[] dirs = Directory
   .EnumerateFiles(@"c:\", "*.*")
   .Where(path => Your_Condition(Path.GetFileNameWithoutExtension(path)))
   .ToArray(); 

例如,让我们测试small(不是大写)字母c的文件名

 string[] dirs = Directory
   .EnumerateFiles(@"c:\", "*.*")
   .Where(path => Path.GetFileNameWithoutExtension(path).Contains('c'))
   .ToArray(); 

【讨论】:

  • 对不起,我的意思是文件名
  • @Nguyễn Ngọc Anh:如果是 文件名,您必须稍微更改通配符;如果实际条件复杂到超出通配符,则必须将Where 与所需条件放在一起。
  • @DmitryBychenko:我知道这是一个旧线程!但是在您的第一段代码中,如果我想在 pdf 文件中而不是在文本文件中搜索字符串怎么办。类似于 windows 搜索 - File contents。我在这里发布了一个问题:*.com/questions/66548502/…
  • @Ashish Srivastava:如果是 pdf 文件,你不能只输入File.ReadLines(file) 并获取所有行;你必须解析它。
【解决方案2】:

要查找文件名包含“foo”的文件,请使用

var files = Directory.EnumerateFiles("C:\\dir", "*foo*", SearchOption.AllDirectories);

要查找文本内容包含“foo”的文件,请使用:

var files = Directory.EnumerateFiles("C:\\dir", "*", SearchOption.AllDirectories)
    .Where(f => File.ReadAllText(f).Contains("foo"));

这应该可以,但它会将整个文件作为文本读取,直到您停止枚举文件列表,因此您可能需要在读取文件列表搜索模式之前过滤它们。您还可以编写自己的方法来检查每个文件,而不是为每个文件将整个内容读入内存。

如果您只想搜索该目录而不是递归搜索子目录,请将 SearchOption.AllDirectories 替换为 SearchOption.TopDirectoryOnly

【讨论】:

  • 如果“foo”是一个字符串怎么办。我可以使用 "" + foo + "" 吗?
  • 传递给EnumerateFiles 的最后一个字符串是一个文件搜索模式,所以应该是"*"+foo+"*"。在内容内搜索时,它使用string.Contains,所以您只需使用.Contains(foo)
【解决方案3】:

如果您要查找的文件以“filetofind”开头,则代码是正确的。但是如果“filetofind”出现在完整文件名之间,那么您的代码必须更改为

string filetofind;
string[] dirs = Directory.GetFiles(@"c:\", "*filetofind*");

【讨论】: