Поиск в каталоге для файлов, которые начинаются с ACCESS, а затем искать этот файл - PullRequest
1 голос
/ 10 августа 2010

Мне нужно использовать C # для поиска в каталоге (C: \ Logs) файлов журналов, имя которых начинается с ACCESS.Как только я нахожу файл, начинающийся с ACCESS, мне нужно найти этот файл и создать коллекцию строк, начинающихся с Identity = "" Примером может быть Identity = "SWN \ smithj", поэтому мне нужно все, от Identity до последних двойных кавычексобраны.После того, как я достиг конца файла, мне нужно перейти к следующему файлу, который начинается с ACCESS.Может кто-нибудь показать мне, как это сделать в C #?

Большое спасибо

Ответы [ 2 ]

2 голосов
/ 10 августа 2010

Вот довольно краткий способ добиться того, что вы ищете.

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="));
2 голосов
/ 10 августа 2010

Похоже, у вас здесь две функции:
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);
        }
    }
}

Это не скомпилировано, поэтому проверьте его дважды, но оно должно быть достаточно близко к тому, что вам нужно.

РЕДАКТИРОВАТЬ : Добавлено полное решение на основе комментариев от ОП. Был скомпилирован и запущен.

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...