【问题标题】:Why does mkdir occasionally give Access Denied?为什么 mkdir 偶尔会给出拒绝访问?
【发布时间】: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 被定义为删除一个目录,而不是在将来的某个时间安排删除。

标签: windows-7 cmd


【解决方案1】:

当文件系统尚未完成删除目录时会发生这种情况。

有时这会同步发生,即在 rmdir 命令完成之前,但有时会有很短但非零的延迟。 (在 XP 中它总是同步的,IIRC。)

如果可能,避免删除并立即重新创建目录;如果无法避免,则需要检测故障并重试。

您可能还应该测试并在必要时重试 rmdir;有时 rmdir 会遇到同样的问题,无法删除整个目录树。

【讨论】:

  • 我不完全确定这是真的,从 procmon 日志看来,Windows Defender 和 Windows Search Indexer/change journal 之类的东西会在删除之前尝试访问它,导致它被锁定。
  • @paulm,这通常是导致延迟的原因,是的。但是延迟以这种方式影响脚本的唯一原因是 rmdir 是异步的。 (如果它是同步的,您可能会认为它无论如何都会失败,因为目录已被锁定,但只有在后台进程 doesn't use oplocks 时才会发生这种情况,并且无论如何都会导致不同的失败模式。)
【解决方案2】:

由于该目录或该目录中的文件已在某些编辑器中打开,因此您必须先从编辑器中关闭该文件/目录,然后再尝试。

这些错误通常出现在我们创建某个目录然后删除它时,但它被部分删除了,我们创建了同名的新目录。

【讨论】: