Читать все txt файлы из папки

287
09 ноября 2017, 03:04

Есть папка, в ней 5 txt файлов, задача софта чтобы он искал строку во всех файлах(пусть показывает файл и строку, которую нашел), пока что у меня получилось только что он читает только 1-й файл, остальные, почему-то нет...как это сделать через File.ReadLines? С начало надо получить все файлы txt из директории потом читать все в поисках строки..

foreach (string lines in Directory.GetFiles(@"C:\Users\Grand\Desktop\folder1\", "*.txt"))//получили все тхт'шники..
            {
string filename = File.ReadLines(lines);

а дальше как readlines юзать ? Что то не хочет пахать..

Answer 1

Пускай существует некий "условный" каталог с *.txt файлами, которые не пустые.

string storagePath = "/path/to/file";
var fileStorage = new List<string[]>();
try{        
    var filePaths = Directory.GetFiles(storagePath, "*.txt")); //string[]
    foreach(string path in filePaths){
        string[] fileLines = System.IO.File.ReadAllLines(path);
        fileStorage.Add(fileLines);
    }
    foreach(string[] fileLines in fileStorage){
        foreach(fileLine in fileLines){
            Console.WriteLine(fileLine);
        }
    Console.WriteLine();
    }
} catch (Exception e){
    /* todo */
}

Дальше, если Вы хотите делать (если я правильно понял вопрос), то Вы можете его разбить на более мелкие составляющие - слова:

var matchWord = "some_word";
var delimiters = new Char[]{'.', ' ', ';'} //массив разделителей
int i = 1;
foreach(string[] fileLines in fileStorage){
   Console.WriteLine("Search in file #" + i++);       
   foreach(fileLine in fileLines){
       var words = fileLine.Split(delimiters);
       foreach(word in words){
           if(word.Equals(someWord){
               return word . " finded!";
           }
       }
   }
}

Да спагетти-код в примере ужасный, но... Вы знаете куда двигаться)

Answer 2

Вам по сути надо:

  1. Найти файлы в папке
  2. Считать каждый файл построчно
  3. Если строка из файла содержит нужный текст - вывести файл и строку

Простейшая реализация

void FindMatches(string directory, string text)
{
    foreach (var file in Directory.GetFiles(directory, "*.*"))
    {
        foreach (var line in File.ReadLines(file))
        {
            if (line.Contains(text))
            {
                Console.WriteLine($"Found match {file} - {line}");
            }
        }
    }
}

Сценарий использования:

FindMatches(@"My Directory", "My Text");
READ ALSO
Как улучшить или чем заменить Spreadsheetgear

Как улучшить или чем заменить Spreadsheetgear

Я использую SSG, WinForm, NET для DesktopСтолкнулся со следующими проблемами:

237
c# непроходимая стена

c# непроходимая стена

Необходимо сделать так, чтобы курсор не мог двигаться за пределы заданной области (допустим, пересечь лэйбл)Написал такой код:

185
Создание нескольких террайнов в юнити

Создание нескольких террайнов в юнити

Для чего нужно несколько террейнов ? короче говоря оптимизировать игру, при входе в триггер что бы террейн включался а если вышел то выключался...

239