开发者

Search Directory for Files that start with ACCESS and then search that file

开发者 https://www.devze.com 2023-01-10 19:15 出处:网络
I need to use C# to search a directory (C:\\Logs) for log files whose name starts with ACCESS.Once I find a file that begins with ACCESS I need to search that file and make a collection of strings tha

I need to use C# to search a directory (C:\Logs) for log files whose name starts with ACCESS. Once I find a file that begins with ACCESS I need to search that file and make a collection of strings that start with Identity=" " An example would be Identity="SWN\smithj" so I need everything from Identity to the last double quotes collected. After I have reached the end of the file, I need to go to the next file that begins with ACCESS. Can someone show me how to do this in C#?

M开发者_Python百科any thanks


It looks like you've got two functions here:
1) Find the Files with names like ACCESS*
2) Search those files for lines like "Identity=*"

To do the first, use a DirectoryInfo object and the GetFiles() method with a search pattern of "ACCESS*".

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

Then you'll loop through those files looking for the data you need.

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);
        }
    }
}

This hasn't been compiled, so double check it, but it should be pretty close to what you need.

EDIT: Added full solution based on comments from OP. Has been compiled and run.

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);
}


Here's a pretty terse way to accomplish what you're after.

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);
}

Usage:

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

精彩评论

暂无评论...
验证码 换一张
取 消