首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对于内存映射文件,不会触发FileSystemWatcherChanged事件

对于内存映射文件,不会触发FileSystemWatcherChanged事件
EN

Stack Overflow用户
提问于 2018-06-05 07:47:27
回答 1查看 237关注 0票数 2

我有一个要在两个进程之间共享的json文件。所以我创建了一个内存映射文件,如下所示。

代码语言:javascript
复制
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;
        }

为了读取和写入文件,我执行了以下操作

代码语言:javascript
复制
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次之后,我用InActiveStatus更新了json文件。同样的,我也在监听任何文件的变化(看看D_IDle事件)。问题是,如果一个普通的文件被更改,我会得到FileSytemWatcher changed事件,它会很好地触发。但是当我使用内存映射文件更新状态时,FileSystemWatcher changed事件永远不会触发,请帮助。

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-05 07:52:22

对内存映射文件使用FileSystemWatcher必须是某种反模式:)。如果您在本地系统上,请使用其中一个进程同步原语(例如信号量)来通知更改。

我的猜测是,FileSystemWatcher在文件句柄关闭时触发,以避免其他进程读取部分写入的文件。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50690204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档