msvcrt.dll无法删除一例

一台windows2000服务器,安装了sqlserver2000,本来没事,但由于工作需要,要安装sybase 12的client,sybase 12的client是java式的安装,不仅只能在本地驱动器上执行(网络驱动器上不行),安装文件的路径中还不能包含中文,甚是麻烦。

安装的过程中提示覆盖msvcrt.dll文件,没仔细看,就给覆盖了,然后在重启的时候就发现sqlserver无法启动了,提示找不到入口。。。msvcrt.dll文件什么的,才想起来覆盖给搞坏了。

从别的地方找了一个正确的msvcrt.dll文件,想拷贝回去吧,却提示文件正在使用中,原来windows中几乎每个程序都用到了这个文件,当然无法直接覆盖了,试过了unlocker也不行,无奈,在c盘根目录新建了一个批处理文件a.bat,内容如下:

copy c:\msvcrt.dll c:\winnt\system32 /Y @rem 建一个目录,就当是成功标记了 mkdir c:\copy_ok

然后在注册表的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce 和 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx 两个位置下新建一个字符串类型的键,内容为“c:\a.bat”,重启系统。。。。

系统重启完毕,一看copy_ok目录也建好了,但文件依然未被覆盖,再使用另外一种方式:

cd c:\winnt\system32 ren msvcrt.dll msvcrt.dll.old copy c:\msvcrt.dll .

没想到居然成功的将文件覆盖了,再次重启系统,问题解决。

不知道设置批处理那一步对后来改名的操作是否有影响,反正搞定了,收工。

Update @ 2007-04-22

今天忽然想到一个会产生这种结果的原因,那就是windows会追踪文件的更名,换一种方式解释,如果你有一个程序持续的写入一个文件,比如apache对access.log的写入,如果你在这个程序仍然运行的情况下,对文件进行更名操作,那么这个程序不会把内容写入新的文件,而是继续写入更名后的文件。所以,对msvcrt.dl进行更名并不影响它的使用,并且是系统允许的操作,而系统重启之后,一切重新开始,新文件就上岗了。

似乎Ubuntu在某些情况下也会这样,以前遇到过,程序正往一个log文件里面写东西呢,把log文件删除,期待程序生成新的log文件,而这怎么也不发生。

One thought on “msvcrt.dll无法删除一例”

Leave a Reply

Your email address will not be published. Required fields are marked *