Windows 7下不稳定的文件删除?

4 投票
6 回答
2102 浏览
提问于 2025-04-15 17:51

我有一个用Python写的测试程序,它会创建和删除很多临时文件。在Windows 7系统下,使用shutil.rmtree这个操作时,有时候会失败(大约不到1%的几率)。这种失败似乎是随机的,不总是出现在同一个文件上,也不是总是以同样的方式,但总是发生在rmtree操作上。看起来像是某种时间上的问题。此外,这种情况也让我想起Windows 7对权限和管理员权限的更加严格的检查,但这里并没有权限问题(因为代码刚刚创建了这些文件),也没有涉及到管理员权限。

这也可能是两个线程或进程之间的时间问题,但这里也没有并发的情况。

以下是两个(部分)错误堆栈跟踪的例子:

  File "C:\ned\coverage\trunk\test\test_farm.py", line 298, in clean
    shutil.rmtree(cleandir)
  File "c:\python23\lib\shutil.py", line 142, in rmtree
    raise exc[0], (exc[1][0], exc[1][1] + ' removing '+arg)
WindowsError: [Errno 5] Access is denied removing xml_1

  File "C:\ned\coverage\trunk\test\test_farm.py", line 298, in clean
    shutil.rmtree(cleandir)
  File "c:\python23\lib\shutil.py", line 142, in rmtree
    raise exc[0], (exc[1][0], exc[1][1] + ' removing '+arg)
WindowsError: [Errno 3] The system cannot find the path specified removing out

在Windows XP上,这个操作从来没有失败过。而在Windows 7上,它在几个不同的Python版本(2.3-2.6,不确定3.1)中都会出现这种失败。

有没有人遇到过类似的情况并找到了解决办法?如果你真的想深入了解,代码可以在bitbucket上找到。

6 个回答

1

我有个想法,如果测试过程中创建和删除很多临时文件的行为,并不是你这个应用程序正常操作的一部分,那你可以考虑把这些文件操作换成(c)StringIO。这样的话,你可以保留一套功能测试,专门用来检查你应用程序实际的文件创建和删除行为。

这样一来,你就能确保你的应用程序运行正常,同时又不会增加与应用程序无关的额外复杂性。

5

这可能有点远,但你有没有在后台运行什么程序在扫描文件夹呢?我在想可能是杀毒软件或者备份程序(也许Windows 7自带有这样的功能?我不太确定)。我曾经在删除或移动文件时遇到过一些小问题,这些问题是由TortoiseSVN启动的TSVNCache.exe进程引起的——这个进程似乎会监视文件夹的变化,然后可能会打开这些文件夹来扫描里面的文件。

1

我们在Windows上也遇到过类似的问题,特别是像你提到的第一个错误信息。我们通过在使用rmtree时加上异常处理来解决了这个问题。详细信息可以查看这个回答

撰写回答