这是我的示例代码:
import os
from tempfile import mkstemp
fname = mkstemp(suffix='.txt', text=True)[1]
os.remove(fname)
当我在Linux上运行时,它正常工作。但是当我在Windows XP上使用Python 3.4.4运行它时,它会引发以下错误:
Traceback (most recent call last):
File "C:\1.py", line 5, in <module>
os.remove(fname)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\DOCUME~1\\IEUser\\LOCALS~1\\Temp\\tmp3qv6ppcf.txt'
然而,当我使用tempfile.NamedTemporaryFile()
创建临时文件并关闭它时,它会自动删除。
为什么Windows无法删除使用mkstemp
创建的文件?我错在哪里了?
mkstemp()
不是只创建文件吗?我的代码中没有open()
,而且fname
是一个字符串对象。 - Remi GuanNamedTemporaryFile
,Python使用WinAPIFILE_FLAG_DELETE_ON_CLOSE
,它需要DELETE
访问权限,并且文件是使用FILE_SHARE_DELETE
共享打开的。这意味着您可以在其上调用os.remove
而不会遇到共享冲突,但请注意,直到最后一个内核引用或句柄关闭之前,该文件实际上并未被删除。删除时关闭标志会导致文件系统将文件标记为要取消链接,但这只有在关闭最后一个引用时才会发生。现有句柄可以调用SetFileInformationByHandle
来撤消删除处理。 - Eryk Sunmkstemp
不使用FILE_FLAG_DELETE_ON_CLOSE
(通过 CRT 的O_TEMPORARY
标志),因此它不会使用DELETE
访问或FILE_SHARE_DELETE
共享打开文件。当您尝试对其调用os.remove
时,它会调用 WinAPI 的DeleteFile
,该函数尝试使用DELETE
访问权限打开以设置删除处理方式,但由于您已经打开了该文件而没有共享删除权限,所以操作失败。 - Eryk Sun