【问题标题】:Can't delete test folder in Windows 7无法在 Windows 7 中删除测试文件夹
【发布时间】:2012-06-02 10:01:31
【问题描述】:

我有一个这样的项目设置

project/src/test/python/main.py
project/test-output

我希望删除主测试脚本,然后重新创建测试输出文件夹。

所以我把这段代码放在那里。

if os.path.exists("test-output"):
    shutil.rmtree("test-output")
os.mkdir("test-output")

但是当我运行它时

d:\projects\thisproject>python src\test\python\main.py

我从 Windows 收到拒绝访问错误。 [错误5]

如何解决这个问题?

mkdir 命令工作得很好。

【问题讨论】:

  • 在什么命令(rmtree 或 mkdir)上拒绝访问?在什么路径上(d:\projects\thisproject?)?请包含完整的回溯。

标签: python windows-7


【解决方案1】:

我最近在 Windows 7 下看到了 shutil.rmtree() 的这种行为,在从单元测试中创建和销毁测试文件夹时也是如此。而且,不,没有任何对目录或其中任何内容的活动引用,甚至没有资源管理器窗口。我的“解决方案”(如果你可以这么说的话)是这样做的:

shutil.rmtree("my/test/dir", ignore_errors=True)

不完全是美丽的东西,但它为我解决了问题。

顺便说一句,这是一台 64 位 Windows 7 机器,在 SSD 上。在另一台机器上删除 Windows 共享目录时,一位同事报告了与 shutil.rmtree() 相同的问题。我感觉 Windows 在这里缓存了一些东西,即使只是短暂的。

【讨论】:

    【解决方案2】:

    Windows 仅将文件/目录标记为“关闭时删除”,这与取消链接会立即从视图中删除项目的 Unix 不同。请参阅 MSDN 中的 Remove Directory 函数的文档。因此,如果任何进程(例如资源管理器窗口、全文索引器或病毒扫描程序)仍然具有该文件的打开句柄,那么您将失败。

    因此,即使您在删除时忽略错误,您也会在 os.mkdir 步骤中失败。一个简单的解决方法是不重新创建目录,而只是删除其所有内容。另一种是等待并在几秒钟后重试操作。

    绕过该限制的最佳方法是每次运行都使用不同的输出文件夹(通过tempfile.makedtemp())。当最后一个引用消失时,您的删除就会开始,但您的重新创建永远不会失败。

    【讨论】:

      【解决方案3】:

      很可能某些东西正在使用该文件夹 - 通过打开位于该文件夹内的文件或将该文件夹或其子文件夹作为其当前工作目录。

      【讨论】:

        【解决方案4】:

        试试这个:

        def renewDir(name):
            while 1:
                try:
                    if os.path.exists(name):
                        shutil.rmtree(name)
                    os.makedirs(name)   
                    break
                except:
                    pass
        

        【讨论】:

          猜你喜欢
          • 2013-08-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-13
          • 1970-01-01
          • 1970-01-01
          • 2015-01-23
          • 2014-08-18
          相关资源
          最近更新 更多