非管理员下内存映射的问题

糯米粽子1218 2019-01-31 03:57:20
今天遇到一个问题,尝试了很多方法都没有解决,希望有大神来帮帮忙,感激不尽!

软件运行描述:
软件每一次运行时都会以当前本地时间为名称新建一个文件存储日志数据,如20180131_152000,通过内存映射存储数据到硬盘(D盘)

问题描述:
1、电脑管理员下运行软件,若文件创建时间为20190131_150000,运行20分钟后停止,文件的最后修改时间为20190131_152000,日志内容完整。正常

2、电脑普通用户下以管理员身份运行软件(每次都要输入管理员密码),若文件创建时间为20190131_150000,运行20分钟后停止,文件的最后修改时间为20190131_152000,日志内容完整。正常

3、电脑普通用户下直接运行软件,若文件创建时间为20190131_150000,运行20分钟后停止,文件的最后修改时间仍然为20190131_150000,但是日志内容完整,即文件中存在15点20分时的日志内容,但是修改时间不会被改变。异常

请问这个问题产生的原理是什么?另外如何解决这个问题!!

请大神赐教,万分感谢
...全文
2071 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
糯米粽子1218 2019-02-12
  • 打赏
  • 举报
回复
引用 11 楼 蒋晟 的回复:
资源管理器信息有缓存所以和文件系统时间不同步很正常,要真看时间的话在命令行下用dir 文件名去看比较可靠。 最可靠的办法是关闭你的程序之后用任何一个程序打开那个日志文件(比如记事本),不保存,然后去看文件时间。 虽然有可能仅仅是资源管理器没和文件系统同步而已,但是你也要考虑是不是在普通用户环境下哪里泄漏了文件日志句柄,文件句柄没关掉的表现之一就是最近更新时间不会及时同步。
现在的解决方案是用了runas命令做了个bat文件去调用软件,把软件运行权限提到管理员,至于这个问题产生的原因和解决办法再慢慢研究
  • 打赏
  • 举报
回复
还有一个问题被忽略了,如果一直用AsyncAppendAllText这样的异步方法写入文件,最后一个异步方法执行完之前是不会有修改时间的变化的………………这是一个功能,不是bug
蒋晟 2019-02-09
  • 打赏
  • 举报
回复
顺便说一句,真有文件写完刷新资源管理器这需求的话,可以去pinvoke SHChangeNotify
YooK 2019-02-08
  • 打赏
  • 举报
回复
确定普通用户有这几个高级权限?修改文件属性,创建,删除。

因为重命名都是用Move这个操作,相当于删除,创建来实现重命名,而更新文件的修改时间,实际上是对文件属性进行修改。
蒋晟 2019-02-07
  • 打赏
  • 举报
回复
资源管理器信息有缓存所以和文件系统时间不同步很正常,要真看时间的话在命令行下用dir 文件名去看比较可靠。 最可靠的办法是关闭你的程序之后用任何一个程序打开那个日志文件(比如记事本),不保存,然后去看文件时间。 虽然有可能仅仅是资源管理器没和文件系统同步而已,但是你也要考虑是不是在普通用户环境下哪里泄漏了文件日志句柄,文件句柄没关掉的表现之一就是最近更新时间不会及时同步。
lovecsdnbbs 2019-02-03
  • 打赏
  • 举报
回复
那些整天牛逼哄哄的人都哪去了?遇到问题都装死了吗。不是动不动就10k,动不动拿个几个offer吗?无耻!
张天星 2019-02-03
  • 打赏
  • 举报
回复
从非技术角度上说,和客户协商一下,让对方管理员模式运行,就说这个软件权限要求比较高,必须这么操作。
如果对方说经常会忘记,或者说每次管理员模式运行很麻烦。
那么给两个意见:首先,快捷方式的兼容模式,可以每次管理员运行,不需要右键特别选择管理员。
另一个方式忘记了,以普通方式运行,你软件直接不运行,给与弹窗提醒。
游北亮 2019-02-02
  • 打赏
  • 举报
回复
另外,你在文件上按右键,看看属性里的3个时间: 创建时间、修改时间、访问时间
游北亮 2019-02-02
  • 打赏
  • 举报
回复
这个对你的业务有什么影响? 你要的是内容,还是说你要根据修改时间进行什么逻辑处理?
糯米粽子1218 2019-02-02
  • 打赏
  • 举报
回复
引用 2 楼 ilikeff8 的回复:
没明白,如果只是写日志,不涉及到同时读写的问题,那直接File.AppendAllText(。。。)不完了么, 或者用log4net
用的log4net,日志只写不读。现在的问题是,在第三种情况下,即普通用户登录电脑,直接运行软件(不是右键以管理员权限运行),在软件运行过程中存储的日志会正常存储,但是文件属性中的修改时间不会被改变,依旧保持为文件被创建时的时间,也就是说,无论我的软件运行了多长时间,最后一条日志是什么时间,日志保存后日志文件的修改时间不会改变 就像这样,文件是8点48分创建的,运行了20分钟,在第20分钟也有日志产生并保存到了文件中,但是文件的修改时间依旧是8点48,而不会变为9点08 如果我一管理员权限运行,文件的修改时间会正常变为最后的保存时间
糯米粽子1218 2019-02-02
  • 打赏
  • 举报
回复
引用 4 楼 水边2的回复:
这个对你的业务有什么影响? 你要的是内容,还是说你要根据修改时间进行什么逻辑处理?
从内容上来讲,对我的软件完全没有影响,日志正常存储,后期也能正常读取。但是客户那边不接受这种现象,他们说他们进行硬盘文件备份是是根据文件时间来判断的,如果文件的修改时间不改变,就无法识别到这个文件被改变过,也就无法备份这个文件。出问题的日志文件,右键属性中的三个时间一直保持为创建时的时间,修改过文件后,文件的修改时间也不会改变
糯米粽子1218 2019-02-01
  • 打赏
  • 举报
回复
有大佬知道这个现象的吗?请指点下迷津
ilikeff8 2019-02-01
  • 打赏
  • 举报
回复
没明白,如果只是写日志,不涉及到同时读写的问题,那直接File.AppendAllText(。。。)不完了么,
或者用log4net

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧