C# читает файл и ищет изменения

Я новичок в C# и хочу создать программу, которая считывает файл конфигурации каждые 30 секунд и проверяет некоторые изменения в определенных значениях.

Значения, которые я ищу, не всегда имеют один и тот же номер строки, поэтому я ищу значения по их ключевым именам. Я хочу найти ключ, а затем проверить, изменилось ли значение.

Для начала я тестирую, могу ли я найти правильный ключ в файле конфигурации.

Вот что я пробовал. Моя проблема в том, что я вызвал эту функцию со следующим вводом:

check_for_changes("TEXTURE_MAX_LOAD  = ");

и я ожидаю, что мой TextBox testtb будет содержать слово changes после вызова метода, но TextBox останется пустым.

public string check_for_changes(string value)
{
    int counter = 0;
    string line;


    System.IO.StreamReader file =
        new System.IO.StreamReader(@"C:\Users\EFB\AppData\Roaming\Microsoft\FSXDemo\fsx.CFG");

    while ((line = file.ReadLine()) != null)
    {
        if (line.Contains(value))
        {
            testtb.Text = "changes";
            break;
        }

        counter++;
    }

    Console.WriteLine("Line number: {0}", counter);

    file.Close();
    return value;
}

Чтобы нам очень помочь, нам, вероятно, нужно знать, каков макет файла.

Ňɏssa Pøngjǣrdenlarp 28.08.2018 22:38

Добро пожаловать в SO. Можете ли вы, зная макет файла, сказать нам, что происходит не так или почему опубликованный вами код не работает? В чем проблема? У вас бывают исключения? Есть ли ошибка при чтении файла? В чем проблема, на которой вы застряли? Из вашего вопроса непонятно. Вы заявили, какова ваша цель, и показали нам свой текущий код, но не объяснили, что происходит не так или почему этот код не работает.

pstrjds 28.08.2018 22:40

вы также можете рассмотреть FileSystemWatcher

Tigran 28.08.2018 22:41

спасибо за ответ, так что вы можете видеть, что я написал testtb.Text = "changes"; но у меня нет текста в текстовом поле после того, как я внес изменения в файл и использую check_for_changes ("TEXTURE_MAX_LOAD = "); Я хочу сделать тест, чтобы попытаться найти, тогда я посмотрю, как проверить изменения

BPW developer 28.08.2018 22:42

Это информация, которую следует добавить к вашему вопросу. Вы уверены, что в этом файле конфигурации есть пробел в значении свойства? Вы написали "TEXTURE_MAX_LOAD = ", но это может быть "TEXTURE_MAX_LOAD = ". Вы используете сопоставление строк, поэтому оно должно быть точным. Я бы подумал, возможно, даже просто поищу "TEXTURE_MAX_LOAD" и посмотрю, получите ли вы результат.

pstrjds 28.08.2018 22:46

хорошо, я увижу через 2 мин

BPW developer 28.08.2018 22:49

да, это была проблема в поиске строки спасибо, если я хочу увидеть, изменилась ли эта строка TEXTURE_MAX_LOAD = 4096 за 30 секунд, я имею в виду, что я хочу продолжать проверять каждые 30 секунд, потому что, возможно, она изменится на TEXTURE_MAX_LOAD = 1024

BPW developer 28.08.2018 22:52

Вы должны сначала попробовать это сами, а если вы застрянете, задайте другой вопрос. Чтобы указать вам в правильном направлении, вы можете взглянуть на String.Split

pstrjds 28.08.2018 22:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
110
1

Ответы 1

Вам нужно поместить этот код там, где вы хотите начать проверку:

 System.Windows.Forms.Timer Timer = new System.Windows.Forms.Timer() { Interval = 30000 };
 Timer.Tick += (obj, arg) =>
 {
     check_for_changes("TEXTURE_MAX_LOAD  = ");
 };
 Timer.Start();

Будь осторожен !!! если вы хотите завершить этот таймер или хотите остановить / запустить его снова, вы должны объявить его глобально.

и функция должна быть такой:

 private string LastValue = "";
 public string check_for_changes(string value)
 {
     int counter = 0;
     string line;


     System.IO.StreamReader file = new System.IO.StreamReader(@"C:\Users\EFB\AppData\Roaming\Microsoft\FSXDemo\fsx.CFG");

     while ((line = file.ReadLine()) != null)
     {
         if (line.Contains(value))
         {
             string NewValue = line.Substring(value.Length);
             if (NewValue != LastValue)
                  testtb.Text = "new Value is : " + NewValue;
             LastValue = NewValue;
             break;
         }

         counter++;
     }

     Console.WriteLine("Line number: {0}", counter);

     file.Close();
     return value;
 }

эта функция будет работать.

Да, но вы должны позаботиться об исключениях. если ваша программа (и особенно файловая операция) не генерирует исключения, она работает; проверьте: docs.microsoft.com/en-us/dotnet/api/…

RezaNoei 30.08.2018 10:07

как сделать исключение, если программа не найдет файл?

BPW developer 30.08.2018 17:56

вы можете использовать блок Try / Catch. Есть несколько исключений в операции ввода-вывода, которые перечислены в приведенной выше ссылке (в предыдущем комментарии). например: попробуйте {// поместите сюда все коды .....} catch (System.IO.FileNotFoundException ex) {MessageBox.Show ("Файл не найден"); }

RezaNoei 30.08.2018 18:20

Другие вопросы по теме