如何防止文件被改名(100分)

  • 主题发起人 主题发起人 freecom
  • 开始时间 开始时间
F

freecom

Unregistered / Unconfirmed
GUEST, unregistred user!
用一直open文件不关句柄的办法,非正常关键可能导致文件丢失或损坏。各位有没有其他好办法或用open但能防止文件丢失的方法也行。
 
楼主啊,头一次听说 Open 的文件非正常关闭能导致丢失或损坏!Pascal 中的 AssignFile 无非就是调用了 Windows 的 CreateFile API 而已,即使发生了异常情况非正常关闭,也无非就是没有再调用 CloseFile API 关闭文件而已,那又能怎么样呢,不就是浪费一个资源句柄么?不至于导致文件损坏吧?您说是不是啊?
下面还有几个办法,不过我认为远远不如 Open 保险和方便。这些方法一般都是吃饱了撑的人才用:
1、Hook 掉 MoveFileW 和 DeleteFileW API 函数,就是过滤 MoveFileW 和 DeleteFileW,一旦发现系统要改掉您的文件名或删掉文件,就阻止 MoveFileW 和 DeleteFileW,让它们不进行任何操作。
2、或者,向“弱智”、“执着”、“万人唾骂”的“37”***“21”学习,将文件藏在您的程序内,隔几秒检查一次,如果文件不在了(可能是被改名了),就释放出一个。
一般地,看似简单的方法往往就是最可靠、最简单的方法,不要想太多了...
 
一般地,您如果想保证一个文件不被删除和修改,可以这样打开文件:
hFile := CreateFile('YourFile.txt', GENERIC_READ, FILE_SHARE_READ, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, 0);
即使非法关闭,也不会对文件造成什么损坏。实际上在 Pascal 中,AssignFile 函数也可以进行类似的操作,不过您要用到一个全局变量 FileMode := 0 来控制读写模式。
 
我还是觉的用最土的办法,定时检查 如果被更改就产生新的。。。。
 
但是这些文件有时我的程序还会写,不能用共享读打开,这也是会造成文件丢失的原因之一。我们测试结果是一般用户不会丢,但是作为system用户(服务打开的)就会丢,谁有更好的方案?
 
To freecom:
1、原来你还要写数据,你为何不早说?写操作的时候非正常关闭造成数据丢失,你不觉得是非常正常的事情么?扯什么“open文件不关句柄的办法”,您不觉得不仅不靠谱还会误导群众么??
2、回过头来你在看看你的标题——“如何防止文件被改名”,再看看你的实际问题,都哪跟哪?
3、如果有完美解决写操作数据丢失的办法,我很想知道,我相信比尔·盖茨也很想知道,因为那样的话 Windows 就永远不会崩溃了。
 
周星星的无里头啊,都哪跟哪啊
看完都不知道究竟在讨论啥问题

这问题,提的有水平,小弟学习了
 
楼主很好很强大...
 
pagefile.sys
 
我们最后采取监控文件名,发现修改马上改回的办法。open的办法不可行。哪位高人还有更好的方法。目前的方法总感觉还是不够完美。(别人如果用自己写的代码短时、快速的连续修改文件名还是有机会跳过我们的监控)。
 
可以看看mysql,linux日志系统实现,无非是先开一个服务打开文件,别人是改不到的(相对),日志系统实现断电恢复(相对)
 
用资源文件,每次使用都删除原来的在释放资源中的,正在使用的文件重命名也无用
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部