1

私は自分の状況を説明するために最善を尽くします。

私はC#を使用してソフトウェアを開発しています。これにより、複数のユーザーが共通のディレクトリの下にある同じファイルを同時に編集し、他のユーザーが行った変更を確認できます。

そこで、FileSystemWatcherを使用して、ファイルの変更を監視し(他の人の変更を更新するため)、テキストボックスのtextchangedを監視しました(ファイルへの変更を保存して、他の人の画面も更新されるようにします)。

文字を入力すると機能します(両方のイベントが1回発生します)任意の形式(バックスペース、削除など)で文字を削除しようとすると機能しません文字は削除されず、カーソルは常に位置0にリセットされます。 box.SelectionStartを使用してカーソルを移動し、文字を入力すると機能します。

ちょっと調べてみると、文字を削除しようとすると、両方のイベントが2回発生することがわかりました。

検索しようとしましたが、答えがまちまちでした...

前もって感謝します

using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;`enter code here`
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Windows.Forms;
    using System.IO;
    using System.Windows.Threading;

    namespace SharedFileEditor
    {
        public partial class EditorView : Window
        {
            private EditorModel model;
            private FileSystemWatcher watcher;
            private string path;
            private int count = 0;
            private int count2 = 0;

            public EditorView()
            {
                InitializeComponent();
                model = new EditorModel();
                this.DataContext = model;
            }

            private void OpenClicked(object sender, RoutedEventArgs e)
            {
                using (OpenFileDialog dialog = new OpenFileDialog())
                {
                    dialog.Filter = "Text files (*.txt)|*.txt";
                    if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        watcher = new FileSystemWatcher(System.IO.Path.GetDirectoryName(dialog.FileName), "*.txt");
                        Console.WriteLine(System.IO.Path.GetDirectoryName(dialog.FileName));
                        watcher.Changed += new FileSystemEventHandler(OnChanged);
                        watcher.EnableRaisingEve`enter code here`nts = true;
                        path = dialog.FileName;
                        HandleOpen(dialog.FileName);
                    }
                }
            }

            internal void HandleOpen(string path)
            {
                FileStream f = File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
                StreamReader reader = new StreamReader(f);
                model.Content = reader.ReadToEnd();
                reader.Close();
            }

            private void OnChanged(object source, FileSystemEventArgs e)
            {
                if (this.Box.Dispatcher.CheckAccess())
                {
                    try
                    {
                        FileStream f = File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
                        StreamReader reader = new StreamReader(f);
                        model.Content = reader.ReadToEnd();
                        this.Box.CaretIndex = model.Cursor;
                        reader.Close();
                        Console.WriteLine("read:" + count2++);
                    }
                    catch (IOException x)
                    {
                        Console.WriteLine(x.Message);
                    }
                }
                else
                {
                    this.Box.Dispatcher.Invoke(
                    new updateContent(OnChanged), source, e);
                }
            }

            private void ContentChanged(object sender, TextChangedEventArgs e)
            {
                FileStream f = File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
                StreamWriter writer = new StreamWriter(f);
                writer.Write(this.Box.Text);
                model.Cursor = this.Box.SelectionStart;
                model.Content = this.Box.Text;
                writer.Close();
                Console.WriteLine("write:"+count++);
            }

            public delegate void updateContent(object source, FileSystemEventArgs e);
        }
    }
4

2 に答える 2

3

私はそれを理解しました...それは私のアプリケーションの動作に関係しています。EnableRaisingEvents フラグを false に設定し、後で true に戻すことで解決しました。

于 2013-01-16T18:05:37.530 に答える