C# 在文件C中查找

C# 在文件C中查找,c#,asp.net,.net,C#,Asp.net,.net,我有一个文件夹,其中有多个子文件夹。每个子文件夹中都有许多.dot和.txt文件 在C.NET中是否有一个简单的解决方案可以遍历每个文件,并检查该文件的内容中是否有关键短语或关键字 Document Name Keyword1 Keyword2 Keyword3 ... test.dot Y N Y 总结如下: 选择一个文件夹 输入要搜索的关键字列

我有一个文件夹,其中有多个子文件夹。每个子文件夹中都有许多.dot和.txt文件

在C.NET中是否有一个简单的解决方案可以遍历每个文件,并检查该文件的内容中是否有关键短语或关键字

Document Name        Keyword1         Keyword2         Keyword3        ...
  test.dot              Y               N                Y
总结如下:

选择一个文件夹 输入要搜索的关键字列表 然后程序将搜索每个文件,并在最后输出类似上面的内容,我不担心创建datatable来显示datagrid,因为我可以这样做。我只需要执行类似于记事本++的查找文件选项的查找文件功能
提前感谢

您需要的是递归地迭代目录中的文件,可能还有它的子目录

因此,您的步骤是使用.NET中的Getfiles循环指定目录中的每个文件。然后,如果遇到目录循环,请再次执行

这可以通过以下代码示例轻松完成:

  public static IEnumerable<string>  GetFiles(string path)
  {
        foreach (string s in Directory.GetFiles(path, "*.extension_here"))
        {
              yield return s;
        }


        foreach (string s in Directory.GetDirectories(path))
        {
              foreach (string s1 in GetFiles(s))
              {
                    yield return s1;
              }
        }
  }
有关在.NET目录中迭代文件的更深入的信息,请参见:


然后使用IndexOf方法from String检查关键字是否在文件中我不鼓励使用ReadAllText,如果文件大小为5 MB,字符串也会太大。逐行将减少内存消耗

第一步:查找所有文件。正如其他人所提到的,使用System.IO.Directory.GetFiles+System.IO.File.ReadAllText很容易做到这一点

第二步:在文件中查找关键字。如果您只有一个关键字,并且可以使用IndexOf方法来完成,那么这很简单,但是多次迭代一个文件,尤其是当它很大时,这是一种浪费

为了在文本中快速找到多个关键字,我认为应该使用Aho Corasick自动机算法。请参阅CodeProject上的C实现:

您可以将Directory.Enumerate文件与searchpattern和递归hintSearchOption.AllDirectory一起使用。使用LINQ可以轻松完成其余的工作:

var keyWords = new []{"Y","N","Y"};
var allDotFiles = Directory.EnumerateFiles(folder, "*.dot", SearchOption.AllDirectories);
var allTxtFiles = Directory.EnumerateFiles(folder, "*.txt", SearchOption.AllDirectories);
var allFiles = allDotFiles.Concat(allTxtFiles);
var allMatches = from fn in allFiles
                 from line in File.ReadLines(fn)
                 from kw in keyWords
                 where line.Contains(kw)
                 select new { 
                     File = fn,
                     Line = line,
                     Keyword = kw
                 };

foreach (var matchInfo in allMatches)
    Console.WriteLine("File => {0} Line => {1} Keyword => {2}"
        , matchInfo.File, matchInfo.Line, matchInfo.Keyword);
请注意,您需要使用System.Linq

有没有办法直接得到电话号码

如果只需要行号,可以使用此查询:

var matches = allFiles.Select(fn => new
{
    File = fn,
    LineIndices = String.Join(",",
                File.ReadLines(fn)
                .Select((l,i) => new {Line=l, Index =i})
                .Where(x => keyWords.Any(w => x.Line.Contains(w)))
                .Select(x => x.Index)),
})
.Where(x => x.LineIndices.Any());

foreach (var match in matches)
    Console.WriteLine("File => {0} Linenumber => {1}"
        , match.File, match.LineIndices);

因为LINQ的查询语法不允许通过索引,所以这有点困难。

下面是一种使用Tim原始答案获取行号的方法:

var keyWords = new[] { "Keyword1", "Keyword2", "Keyword3" };
var allDotFiles = Directory.EnumerateFiles(folder, "*.dot", SearchOption.AllDirectories);
var allTxtFiles = Directory.EnumerateFiles(folder, "*.txt", SearchOption.AllDirectories);
var allFiles = allDotFiles.Concat(allTxtFiles);
var allMatches = from fn in allFiles
                 from line in File.ReadLines(fn).Select((item, index) => new { LineNumber = index, Line = item})
                 from kw in keyWords
                 where line.Line.Contains(kw)
                 select new
                 {
                     File = fn,
                     Line = line.Line,
                     LineNumber = line.LineNumber,
                     Keyword = kw
                 };

foreach (var matchInfo in allMatches)
    Console.WriteLine("File => {0} Line => {1} Keyword => {2} Line Number => {3}"
        , matchInfo.File, matchInfo.Line, matchInfo.Keyword, matchInfo.LineNumber);

使用Directory.GetFiles和File.ReadAllText应该没有问题……Directory.GetFiles和Directory.GetDirectories需要注意的一点是,当路径大于260个字符时,它们会抛出一个指向long异常的路径-这最近让我感到刺痛。@Dve我认为windows不支持超过260个字符。当您创建文件名过长的文件或目录时,它会给您带来错误。@Gam\u Erix windows有.Netdoesnt@Dve如果Windows拒绝创建路径名长度超过260个字符的文件/目录,那么.NET怎么会给出路径名过长的错误o好吧,如果从zip存档中解包,那么是的。@Gam_Erix您可以在windows中创建超过260个字符的文件夹路径-试试看。根据文件的数量和大小,编译的正则表达式可能要快得多。回答得很好,有没有办法直接得到电话号码?