【发布时间】:2014-10-13 04:53:26
【问题描述】:
我有 BAT 脚本,这些脚本没什么复杂的,在 XP 上运行良好。但是在 Win 7 上,在 rmdir 之后执行的 mkdir 大约有五分之一给出了一个神秘的访问被拒绝。例如
S:\TLIB importing\! Curtains\2 To process>rmdir temp3allout /s /q
S:\TLIB importing\! Curtains\2 To process>mkdir temp3allout
Access is denied.
之后,当我在资源管理器中尝试时,创建该目录没有问题。再次运行那个BAT通常会成功。
知道这里发生了什么吗?
Win XP 光盘是普通的 2Gb 驱动器。 Win 7 磁盘是 2Gb 英特尔 RST RAID1 阵列,缓存和刷新已禁用http://i.imgur.com/Ohqkg2t.png。
【问题讨论】:
-
文件系统还没有完成删除目录。有时这会同步发生,即在
rmdir命令完成之前,但有时会有很短但非零的延迟。 (在 XP 中它始终是同步的,IIRC。)如果可能,避免删除并立即重新创建目录;如果无法避免,则需要检测故障并重试。 -
@Harry,听到对操作系统进行了如此重大的更改,我真的很惊讶,但它确实符合我的观察。谢谢。请输入它作为答案,以便我接受。
-
最后一个句柄关闭时删除完成。那没有改变。通常,是防病毒软件使目录保持打开状态并阻止删除完成。
-
@RaymondChen:我知道在内核层总是如此,但在我看来,
DeleteFile过去常常等待删除完成后再返回。我从未在 XP 或更早版本中遇到过这个问题,而且我也不知道其他人在 Vista 之前的任何报告。 OTOH,我想这可能是因为 Vista 强制更改了防病毒软件的工作方式,而不是因为 DeleteFile 功能本身的任何更改。 -
@RaymondChen,我看不到阻止完成。如果我延迟完成,那么这本身就不是问题。但如果 rmdir 未能等待完成,那就是个问题。 rmdir 被定义为删除一个目录,而不是在将来的某个时间安排删除。