搜索以ACCESS开头的文件的目录,然后搜索该文件

时间:2010-08-10 14:52:47

标签: c# string

我需要使用C#在目录(C:\ Logs)中搜索名称以ACCESS开头的日志文件。一旦我找到一个以ACCESS开头的文件,我需要搜索该文件并创建一个以Identity =“”开头的字符串集合。一个例子是Identity =“SWN \ smithj”所以我需要从Identity到最后一个双引号的所有内容集。到达文件末尾后,我需要转到以ACCESS开头的下一个文件。有人可以告诉我如何在C#中做到这一点?

非常感谢

2 个答案:

答案 0 :(得分:2)

看起来你在这里有两个功能:
1)找到名称为ACCESS *
的文件 2)在这些文件中搜索“Identity = *”

这样的行

要做第一个,请使用DirectoryInfo对象和GetFiles()方法,搜索模式为“ACCESS *”。

DirectoryInfo myDir = new DirectoryInfo(dirPath);
var files = DirectoryInfo.GetFiles("ACCESS*");

然后,您将遍历这些文件以查找所需的数据。

List<Tuple<string, string>> IdentityLines = new List<Tuple<string, string>>();//Item1 = filename, Item2 = line
foreach(FileInfo file in files)
{
    using(StreamReader sr = new StreamReader(file.FullName) //double check that file.FullName I don't remember for sure if it's right
    {
        while(!string.IsNullOrEmpty(string line = sr.Read())
        {
           if(line.StartsWith("Identity=")) 
              IdentityLines.Add(file.FileName, line);
        }
    }
}

这还没有被编译,所以仔细检查它,但它应该非常接近你需要的。

编辑:根据OP的评论添加了完整的解决方案。已编译并运行。

DirectoryInfo myDir = new DirectoryInfo(@"C:\Testing");
var Files = myDir.GetFiles("ACCESS*");

List<KeyValuePair<string, string>> IdentityLines = new List<KeyValuePair<string, string>>();

foreach(FileInfo file in Files)
{
    string line = "";
    using(StreamReader sr = new StreamReader(file.FullName))
    {
        while(!String.IsNullOrEmpty(line = sr.ReadLine()))
        {
           if(line.ToUpper().StartsWith("IDENTITY="))
              IdentityLines.Add(new KeyValuePair<string, string>(file.Name, line));
        }
    }
}

foreach(KeyValuePair<string, string> line in IdentityLines) 
{
    Console.WriteLine("FileName {0}, Line {1}", line.Key, line.Value);
}

答案 1 :(得分:2)

这是一种非常简洁的方式来完成你所追求的目标。

public static IEnumerable<string> GetSpecificLines(this DirectoryInfo dir, string fileSearchPattern, Func<string, bool> linePredicate)
{
    FileInfo[] files = dir.GetFiles(fileSearchPattern);

    return files
        .SelectMany(f => File.ReadAllLines(f.FullName))
        .Where(linePredicate);
}

用法:

var lines = new DirectoryInfo("C:\Logs")
    .GetSpecificLines("ACCESS*", line => line.StartsWith("Identity="));