Как читать и искать несколько текстовых файлов в listBox с (в) одной кнопкой C #? - PullRequest
0 голосов
/ 12 июня 2019
private void btnOpen_Click(object sender, EventArgs e)
{
    FolderBrowserDialog fbd = new FolderBrowserDialog();

    if (fbd.ShowDialog() == DialogResult.OK)
    {
        listBox1.Items.Clear();
        string[] allfiles = Directory.GetFiles(fbd.SelectedPath, "*.txt*", 
            SearchOption.AllDirectories);

        foreach (string file in allfiles)
        {
            FileInfo info = new FileInfo(file);
            listBox1.Items.Add(Path.GetFileName(file)); 
        }
    }
}

Существует listbox1 со всеми TXT-файлами из директории и подпапки ...

Теперь мне нужно из этого списка все файлы и поиск по какой-то строке.

Могу ли я повторить цикл и прочитать файл за файлом? Я понятия не имею, как читать и искать файлы, нужно ли мне сначала открывать их, а затем где-то хранить данные файла, может быть, list или listView?

1 Ответ

0 голосов
/ 12 июня 2019

Во-первых, я бы использовал собственный класс для хранения результатов поиска. Когда мы ищем файлы, и если мы находим ключевое слово, которое ищем, мы создаем объект этого класса и помещаем его в список. Примерно так:

public class SearchResults
{
    public string FilePath { get; set; }
    public string SearchWord { get; set; }
    public int Occurences { get; set; }
}

Затем вы можете использовать класс System.IO.File для чтения ваших файлов. Помните, что это не единственный способ, а всего лишь один из способов сделать это. Здесь у меня есть список имен файлов, который эквивалентен массиву в вашей программе.

var searchTerm = "Hello";

var fileList = new List<string>() { "A.txt", "B.txt", "C.txt" };
var resultList = new List<SearchResults>();

// Iterate through files. You already are doing this.
foreach (var file in fileList)
{
    // Check to see if file exists. This is a second line of defense in error checking, not really necessary but good to have.
    if (File.Exists(file))
    {
        // Read all lines in the file into an array of strings.
        var lines = File.ReadAllLines(file);
        // In this file, extract the lines contain the keyword
        var foundLines = lines.Where(x => x.Contains(searchTerm));
        if (foundLines.Count() > 0)
        {
            var count = 0;
            // Iterate each line that contains the keyword at least once to see how many times the word appear in each line
            foreach (var line in foundLines)
            {
                // The CountSubstring helper method counts the number of occurrences of a string in a string.
                var occurences = CountSubstring(line, searchTerm);
                count += occurences;
            }
            // Add the result to the result list.
            resultList.Add(new SearchResults() { FilePath = file, Occurences = count, SearchWord = searchTerm });
        }
    }
}

Вспомогательный метод CountSubstring().

public static int CountSubstring(string text, string value)
{
    int count = 0, minIndex = text.IndexOf(value, 0);
    while (minIndex != -1)
    {
        minIndex = text.IndexOf(value, minIndex + value.Length);
        count++;
    }
    return count;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...