C# 在文件C中查找
我有一个文件夹,其中有多个子文件夹。每个子文件夹中都有许多.dot和.txt文件 在C.NET中是否有一个简单的解决方案可以遍历每个文件,并检查该文件的内容中是否有关键短语或关键字C# 在文件C中查找,c#,asp.net,.net,C#,Asp.net,.net,我有一个文件夹,其中有多个子文件夹。每个子文件夹中都有许多.dot和.txt文件 在C.NET中是否有一个简单的解决方案可以遍历每个文件,并检查该文件的内容中是否有关键短语或关键字 Document Name Keyword1 Keyword2 Keyword3 ... test.dot Y N Y 总结如下: 选择一个文件夹 输入要搜索的关键字列
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个字符的文件夹路径-试试看。根据文件的数量和大小,编译的正则表达式可能要快得多。回答得很好,有没有办法直接得到电话号码?