Обновить текстовое поле из txt файла во время выполнения, не нажимая «обновить»

В wpf у меня есть текстовое поле, содержимое которого поступает из текстового файла.

в коде это выглядит так:

public MyWindow()
{
    InitializeComponent();
    ReadFromTxt();
}
void Refresh(object sender, RoutedEventArgs e)
{
    ReadFromTxt();
}

void ReadFromTxt()
{
    string[] lines = System.IO.File.ReadAllLines(@"D:\Log.txt");
    foreach (string line in lines)
    {
        MyTextBox.AppendText(line + Environment.NewLine);
    }
}

Дело в том, что содержимое txt файла меняется во время выполнения, можно ли синхронизироваться с этими изменениями? Я имею в виду, что содержимое текстового поля изменится, если будет изменен текстовый файл. если возможно, дайте пример кода я C# или XAML.

Мое решение на данный момент состоит в том, что я сделал кнопку «Обновить», которая снова читает из текстового файла.

Вам нужен FileSystemWatcher ... Можете посмотреть msdn.microsoft.com/en-us/library/…

Adem Catamak 18.05.2018 20:31
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
1
676
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вид :

<TextBox Text = "{Binding myText}"/>

Модель:

private string _myText;
public string MyText{
    get { return _myText; }
    set { _myText = value;
          NotifyPropertyChanged();
}

Внедрите INotifyPropertyChanged в свое окно И измените свойство MyText, а не MyTextBox

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

Pic Mickael 18.05.2018 20:52
Ответ принят как подходящий

Вы можете настроить FileSystemWatcher. В качестве примера я добавил функцию FileWatcherConfigure.

При каждом изменении файла будет опубликовано событие FileChanged. Вы должны запустить метод RefreshTextbox с этим событием.

FileSystemWatcher fileWatcher = new FileSystemWatcher();
string filePath = @"./Log.txt";
public MainWindow()
{
    InitializeComponent();

    ReadFromTxt();
    FileWatherConfigure();
}

public void FileWatherConfigure()
{
    fileWatcher.Path = System.IO.Path.GetDirectoryName(filePath);
    fileWatcher.Filter = System.IO.Path.GetFileName(filePath);
    fileWatcher.Changed += FileWatcher_Changed;
    fileWatcher.EnableRaisingEvents = true;
}

private void FileWatcher_Changed(object sender, FileSystemEventArgs e)
{
    Thread.Sleep(TimeSpan.FromSeconds(1));

    ReadFromTxt();
}


void ReadFromTxt()
{
    string[] lines = System.IO.File.ReadAllLines(filePath);
    MyTextBox.Dispatcher.Invoke(() => { this.MyTextBox.Text = string.Join(Environment.NewLine, lines); });
}

Рад помочь :)

Adem Catamak 18.05.2018 21:01

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

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

Я слежу за:

  • LastAccess: чтобы получить событие, когда файл был изменен
  • LastWrite: чтобы получить событие, когда файл был изменен
  • FileName: чтобы получить событие при переименовании файла, которое соответствует

Обратите внимание, что я очищаю текстовое поле каждый раз, чтобы избежать дублирования строк (ваш код добавит весь файл к существующему содержимому)

public class MyWindow : Window
{
  public MyWindow()
  {
    InitializeComponent();

    FileSystemWatcher watcher = new FileSystemWatcher();
    watcher.Path = @"D:\";
    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName;
    watcher.Filter = "Log.txt";

    // Add event handlers.
    watcher.Changed += new FileSystemEventHandler(OnFileChanged);
    watcher.Created += new FileSystemEventHandler(OnFileChanged);
    watcher.Renamed += new RenamedEventHandler(OnFileRenamed);

    // Begin watching.
    watcher.EnableRaisingEvents = true;

    ReadFromTxt();
  }

  private void OnFileChanged(object source, FileSystemEventArgs e)
  {
    ReadFromTxt();
  }

  private void OnFileRenamed(object source, RenamedEventArgs e)
  {
    ReadFromTxt();
  }

  private void ReadFromTxt()
  {
    // The easiest way is to just replace the whole text
    MyTextBox.Text = "";
    if (System.IO.File.Exists(@"D:\Log.txt") == false)
    {
      return;
    }
    string[] lines = System.IO.File.ReadAllLines(@"D:\Log.txt");
    foreach (string line in lines)
    {
      MyTextBox.AppendText(line + Environment.NewLine);
    }
  }
}

Чтобы прояснить другие ответы, FileSystemWatcher может быть вариантом, но вам определенно следует рассмотреть возможность опроса в качестве альтернативы. Для удобочитаемости (на основе мнения) и надежности (см. Этот нить). Обратите внимание, что есть много других сообщений, в которых подчеркиваются проблемы, связанные с использованием FileSystemWatcher.

Под опросом я подразумеваю поиск изменений в определенные периоды. Можно было бы использовать Таймер и искать изменения и действовать соответственно.

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