当前位置:  开发笔记 > 编程语言 > 正文

如何在目录中的所有文件中搜索字符串?我出现了内存异常

如何解决《如何在目录中的所有文件中搜索字符串?我出现了内存异常》经验,为你挑选了1个好方法。

我在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这样的文件我怎么能这样做?



1> Jamiec..:

如果可能的话,如何更快地进行搜索?如何避免此异常?

这条线:

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)
    ....

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有