我在form1构造函数中调用了两个方法:
DirSearch(@"D:\C-Sharp"); SearchInFiles();
DirSearch方法:
public static void DirSearch(string sDir) { try { foreach (string d in Directory.GetDirectories(sDir)) { foreach (string f in Directory.GetFiles(d)) { files.Add(f); } DirSearch(d); } } catch (System.Exception excpt) { Console.WriteLine(excpt.Message); } }
而SearchInfiles方法:
private void SearchInFiles() { for (int i = 0; i < files.Count; i++) { string[] lines = File.ReadAllLines(files[i]); for (int x = 0; x < lines.Length; x++) { if (lines[x].Contains("setting")) { filesContent.Add(lines[x]); } } } }
我在线路上的内存异常:
string[] lines = File.ReadAllLines(files[i]);
如果可能的话,如何更快地进行搜索?如何避免此异常?
也许我需要以某种方式使它不会在dll文件和其他文件中搜索不可编辑的文件,例如*.cs和*.txt这样的文件我怎么能这样做?
如果可能的话,如何更快地进行搜索?如何避免此异常?
这条线:
string[] lines = File.ReadAllLines(files[i]);
"它在锡上说的是什么" - 它从整个文件(在内存中)读取每一行.对于非常大的文件,这将占用大量内存.
避免这种情况的方法是不要一次性将每一行加载到内存中,而是逐行将文件流入内存.
using(var streamReader sr = new StreamReader(files[i])) { string line; while((line = sr.ReadLine()) != null) { if (line.Contains("setting")) { filesContent.Add(line); } } }
请注意,如果使用.NET 4或更高版本,这将变得更加简单 File.ReadLines
foreach(var line in File.ReadLines(files[i])) { .... }
也许我需要以某种方式使它不会在dll文件和其他文件中搜索不可编辑的文件,例如*.cs和*.txt这样的文件我怎么能这样做?
您通过向重载提供searchPattern来完成该部分GetFiles
foreach (string f in Directory.GetFiles(d,"*.txt")) ....
似乎没有办法提供多个文件扩展名,但您可以简单地将2个列表链接在一起
// all txt or cs files var files = Directory.GetFiles(d,"*.txt").Concat(Directory.GetFiles(d,"*.cs")); foreach(var f in files) ....