在使用Python删除之前递归更改目录权限

时间:2013-12-10 21:21:44

标签: python

    print "Deleting ", temp_dir
    try:
        os.chmod(temp_dir, stat.S_IRWXU)
        shutil.rmtree(temp_dir)
    except Exception, e:
        print(e)
        raise

抛出错误“[错误5]访问被拒绝:'c:\ temp \ metabuild \ common \ build \ build.cmd'”

所有者对文件build.cmd只有读取权限,我添加了chmod行,如代码中所示更改它,但它没有做任何事情,权限仍然相同,有什么帮助吗?感谢。

1 个答案:

答案 0 :(得分:0)

在Windows上,即使os.stat表示您具有写入权限,也可能无法删除文件或目录的原因有很多:

  • 您可能没有父目录的写入权限。
  • 文件系统可能是只读的。
  • 该文件当前可能在其他一些没有使用FILE_SHARE_DELETE共享模式的进程中打开(大多数程序都没有 - 特别是任何使用Python用于文件的POSIX样式API的程序)永远不会使用这种共享模式。)
  • 文件上的实际ACL可能过于复杂而无法表示为POSIX样式的权限,因此您实际上没有权限删除该文件,即使它和它的父文件在Unix中直接显示为+ w-样式函数,如stat

除非是第一个,否则无法通过Python使用的POSIX-y API确切地知道发生了什么;它不了解Windows共享模式,ACL或任何其他可能存在问题的内容。您将需要使用通过本机Win32 API工作的工具。您可以通过pywin32(或ctypes或类似于DLL,如果您真的更喜欢)从Python执行此操作,但您可能想要找出Explorer或各种Sysinternals的问题。首先是工具。

如果您不知道Win32与POSIX不同的所有疯狂方法,请在MSDN上阅读Creating and Opening Files

此外,如果您在Cygwin Python而不是本机Python下运行此代码,则必须切换;在Cygwin中,你只能访问Cygwin层,它在Windows上模拟一个真正的POSIX环境,并且不允许你访问下面的Win32内容。

无论如何,一旦你知道问题是什么,很可能在你的代码中解决它的唯一方法是再次通过pywin32删除到Win32 API。或者,如果您尝试执行覆盖共享模式之类的操作,则必须降低到NT层,您必须通过ctypes访问该层。并且由于您需要的大部分内容都没有真正记录(对于 记录的部分,搜索“驱动程序开发”),您可能需要将C源代码挖掘到Sysinternals工具找出如何强制另一个进程关闭文件,或删除文件,即使其他进程已关闭。