Pregunta

He implementado una operación "segura salvar" que dice algo como esto:

  1. Save algunos datos a A archivo temporal
  2. Copiar el contenido de A a B destino final
  3. Eliminar A

Tengo una condición de carrera en el paso 3 en Mac OS X de vez en cuando volver con el error -47 (fBsyErr) al intentar eliminar el archivo con FSDeleteObject. Estoy completamente seguro de que soy el único que modificar este archivo y sospecho que el sistema operativo está haciendo algo (por ejemplo, las tareas de fondo de caché) en el momento trato de borrar el archivo, lo que resulta en el error.

Este es un problema intermitente: normalmente la llamada FSDeleteObject funciona bien. En aquellos casos en que recibo el código de error de vuelta Me gustaría eliminar el fichero "en un momento posterior en el tiempo" cuando el sistema operativo ha terminado de jugar con él.

¿Cuál sería el mejor curso de acción a tomar para tratar de eliminar este archivo temporal problemático?

¿Fue útil?

Solución

Aquí es lo que está sucediendo:

  
      
  1. La causa más común de FSDeleteObject fallar temporalmente con fBsyErr es que Spotlight está en el proceso de indexación del archivo. Si modifica un archivo, cerrarlo, y luego tratar de inmediato para eliminarlo usando FSDeleteObject, es muy posible que el indexador de Spotlight que se abra y obtendrá fBsyErr.
  2.   
  3. Algunos programas antivirus de terceros también pueden desencadenar este problema. Al cerrar un archivo modificado, el escáner antivirus se inicia de inmediato para comprobar en busca de virus. Si todavía está comprobando cuando intenta eliminar el archivo, FSDeleteObject fallará con fBsyErr.
  4.   

Cada problema tiene una serie de soluciones, el mejor para los dos es el uso de unlink

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top