Я новичок в 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;
}
Добро пожаловать в SO. Можете ли вы, зная макет файла, сказать нам, что происходит не так или почему опубликованный вами код не работает? В чем проблема? У вас бывают исключения? Есть ли ошибка при чтении файла? В чем проблема, на которой вы застряли? Из вашего вопроса непонятно. Вы заявили, какова ваша цель, и показали нам свой текущий код, но не объяснили, что происходит не так или почему этот код не работает.
вы также можете рассмотреть FileSystemWatcher
спасибо за ответ, так что вы можете видеть, что я написал testtb.Text = "changes"; но у меня нет текста в текстовом поле после того, как я внес изменения в файл и использую check_for_changes ("TEXTURE_MAX_LOAD = "); Я хочу сделать тест, чтобы попытаться найти, тогда я посмотрю, как проверить изменения
Это информация, которую следует добавить к вашему вопросу. Вы уверены, что в этом файле конфигурации есть пробел в значении свойства? Вы написали "TEXTURE_MAX_LOAD = ", но это может быть "TEXTURE_MAX_LOAD = ". Вы используете сопоставление строк, поэтому оно должно быть точным. Я бы подумал, возможно, даже просто поищу "TEXTURE_MAX_LOAD" и посмотрю, получите ли вы результат.
хорошо, я увижу через 2 мин
да, это была проблема в поиске строки спасибо, если я хочу увидеть, изменилась ли эта строка TEXTURE_MAX_LOAD = 4096 за 30 секунд, я имею в виду, что я хочу продолжать проверять каждые 30 секунд, потому что, возможно, она изменится на TEXTURE_MAX_LOAD = 1024
Вы должны сначала попробовать это сами, а если вы застрянете, задайте другой вопрос. Чтобы указать вам в правильном направлении, вы можете взглянуть на String.Split





Вам нужно поместить этот код там, где вы хотите начать проверку:
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/…
как сделать исключение, если программа не найдет файл?
вы можете использовать блок Try / Catch. Есть несколько исключений в операции ввода-вывода, которые перечислены в приведенной выше ссылке (в предыдущем комментарии). например: попробуйте {// поместите сюда все коды .....} catch (System.IO.FileNotFoundException ex) {MessageBox.Show ("Файл не найден"); }
Чтобы нам очень помочь, нам, вероятно, нужно знать, каков макет файла.