¿Por qué el WindowsError al borrar el archivo temporal?
-
16-09-2019 - |
Pregunta
- He creado un archivo temporal.
- añadido algunos datos en el archivo creado.
- guardado y luego tratar de eliminarlo.
Pero estoy WindowsError
. He cerrado el archivo después de editarlo. ¿Cómo puedo comprobar la otro proceso está accediendo al archivo.
C:\Documents and Settings\Administrator>python
Python 2.6.1 (r261:67517, Dec 4 2008, 16:51:00) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tempfile
>>> __, filename = tempfile.mkstemp()
>>> print filename
c:\docume~1\admini~1\locals~1\temp\tmpm5clkb
>>> fptr = open(filename, "wb")
>>> fptr.write("Hello World!")
>>> fptr.close()
>>> import os
>>> os.remove(filename)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
WindowsError: [Error 32] The process cannot access the file because it is being used by
another process: 'c:\\docume~1\\admini~1\\locals~1\\temp\\tmpm5clkb'
Solución
A partir de la documentación de :
mkstemp () devuelve una tupla que contiene un identificador de nivel de sistema operativo en un archivo abierto (como sería devuelto por os.open ()) y el nombre de ruta absoluta de ese archivo, en ese orden. Nuevo en la versión 2.3.
Por lo tanto, los retornos mkstemp
tanto el identificador de archivo del sistema operativo a y el nombre de archivo del archivo temporal. Cuando se vuelva a abrir el archivo temporal, el identificador de archivo devuelto original todavía está abierto (nadie que deje de abrir dos o más veces el mismo archivo en el programa).
Si desea operar en ese identificador de archivo del sistema operativo como un objeto de archivo pitón, se puede:
>>> __, filename = tempfile.mkstemp()
>>> fptr= os.fdopen(__)
y luego continuar con su código normal.
Otros consejos
El archivo está todavía abierto. Haga lo siguiente:
fh, filename = tempfile.mkstemp()
...
os.close(fh)
os.remove(filename)
Creo que necesita para liberar el fptr para cerrar el archivo limpiamente. Pruebe a establecer fptr en Ninguno.