Отслеживайте, когда два файла загружаются в одном экземпляре с помощью FileSystemWatcher - PullRequest
0 голосов
/ 21 февраля 2019

При открытии файла вызывается следующий метод:

     private void Load(string fileName)
    {
        // Only watch seq files.
        this.watcher.Path = Path.GetDirectoryName(fileName);

        // Watch for changes in LastAccess and LastWrite times, and
        // the renaming of files or directories.
        this.watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
                                  | NotifyFilters.FileName | NotifyFilters.DirectoryName;
        this.watcher.Filter = Path.GetFileName(fileName);

        // Begin watching.
        this.watcher.EnableRaisingEvents = true;

        // Add event handlers.
        this.watcher.Changed += this.OnChanged;

        // code for opening file asynchronously            
    }

    private void OnChanged(object source, FileSystemEventArgs e)
    {
        App.Current.Dispatcher.Invoke(() =>
        {
            MessageBoxResult result = CustomMessageBox.ShowYesNoCancel(
                "The file has been modified by another  instance.",
                "More instances are opened!",
                "Overwrite",
                "Reload",
                "Save as",
                MessageBoxImage.Exclamation);

            if (result == MessageBoxResult.Yes)
            {
                // Overwrite                    
            }

            if (result == MessageBoxResult.Cancel)
            {
                // Save as;                   
            }

            if (result == MessageBoxResult.No)
            {
                // reload file and lose changes

            }
        });
        var t = new System.Timers.Timer();
        ((FileSystemWatcher)source).Changed -= new FileSystemEventHandler(this.OnChanged);
        t.Interval = 1000;
        t.Elapsed += new ElapsedEventHandler(Elapsed);
        t.Start();
    }

    private static void Elapsed(object sender, ElapsedEventArgs e)
    {
        ((System.Timers.Timer)sender).Stop();
    }

1. Я очень разочарован тем, что я получаю свой MessageBox только тогда, когда файл из одного экземпляра сохранен, но мне нравится, когда мойсообщение при загрузке файла на втором экземпляре.Основная проблема заключается в том, что пользователь открыл приложение дважды, и теперь его можно модифицировать в обоих случаях.Для сохранения я использую этот метод:

public override void WriteStartObject (модуль записи XmlDictionaryWriter, граф объектов);

Работает ли этот NotifyFilters.LastAccess?Для меня просто NotifyFilters.LastWrite, кажется, работает ...

Другая небольшая проблема заключается в том, что после того, как я сохранил изменения в своем файле в одном экземпляре, MessageBox появляется дважды (как будто у меня не хватает проблем).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...