Событие FileSystemWatcherChanged не запускается для файла с отображенной памятью - PullRequest
0 голосов
/ 05 июня 2018

У меня есть файл json, которым я хочу поделиться между двумя процессами.Поэтому я создал файл отображения памяти следующим образом.

private void CreateMemoryMappedFile()
        {
            var info = Directory.CreateDirectory(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "/" + model.Data.Settings.OrcaUISpecificSettings.TimeOutFolder);
            string path = Path.Combine(info.FullName + @"\" + model.Data.Settings.OrcaUISpecificSettings.File);
            FullPath = path;
            try
            {
                mmf = MemoryMappedFile.CreateFromFile(path, FileMode.CreateNew, "MyMemoryFile", 1024 * 1024);
            }
            catch (Exception ex)
            {

            }
        }

        public MemoryMappedViewStream GetAccessor()
        {
            MemoryMappedViewStream FileMapView = null;
            if (FileMapView != null)
            {
                return FileMapView;
            }
            FileMapView = mmf.CreateViewStream();
            return FileMapView;
        }

И для чтения и записи в файлы я делаю следующее

public void WriteToMemoryMappedFile(string Data)
        {
            try
            {
                mutex.WaitOne();
                byte[] bytes = Encoding.ASCII.GetBytes(Data);
                var accessor = GetAccessor();

                accessor.Write(bytes, 0, Data.Length);
                mutex.ReleaseMutex();
            }
            catch (Exception ex)
            {

            }
        }

public string ReadFromMemoryMappedFile()
        {
            mutex.WaitOne();
            var accessor = GetAccessor();
            using (BinaryReader binReader = new BinaryReader(accessor))
            {
                byte[] reader = binReader.ReadBytes((int)accessor.Length);
                string result = Encoding.Default.GetString(reader);
                mutex.ReleaseMutex();
                return result.Replace("NULL", "");
            }
        }

Моя проблема в том, что у меня есть монитор активности длямое приложение.Таким образом, через x времени я обновляю файл json с помощью InActiveStatus.В том же духе я слушаю любые изменения файла (посмотрите на событие D_IDle).Проблема в том, что если обычный файл изменен, я получаю событие изменения FileSytemWatcher, запускающееся очень хорошо.Но когда я использую файл сопоставления памяти для обновления состояния, событие изменения FileSystemWatcher никогда не срабатывает, помогите.

private void D_IsIdle(object sender, EventArgs e)
        {
            MonitorDirectory();
            //AppViewModel.SerializeData("InActive");
            AppViewModel.SerializeDataToMemoryMap("InActive");
            d.IsIdle -= D_IsIdle;
        }
public void MonitorDirectory()
        {
            FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(AppViewModel.GetDriectory());
            fileSystemWatcher.NotifyFilter = NotifyFilters.LastWrite;
            fileSystemWatcher.Filter = "*.json";
            fileSystemWatcher.Changed += FileSystemWatcher_Changed;
            fileSystemWatcher.EnableRaisingEvents = true;
        }
private void FileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
{
//IT NEVER COMES HERE
}

1 Ответ

0 голосов
/ 05 июня 2018

Использование FileSystemWatcher с отображенными в память файлами должно быть своего рода антишаблоном :).Если вы находитесь в локальной системе, используйте один из примитивов синхронизации процесса (например, семафоры), чтобы сообщить об изменении.

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

...