Estoy usando Transactional NTFS para atomizar múltiples escrituras en varios archivos. El problema es que después de confirmar, es posible que no pueda volver a abrir un archivo, Tal vez debido a una condición de carreras.
La secuencia de eventos es:
- La transacción NTFS se crea con
CreateTransaction
- Los archivos se abren con
CreateFileTransacted
- Se hacen escrituras a los archivos.
- Los archivos están cerrados con
CloseHandle
- La transacción se compromete con
CommitTransaction
- Los archivos se vuelven a abrir con
CreateFile
para leer / escribir
El último paso a veces falla con el código de error 3: ERROR_PATH_NOT_FOUND: el sistema no puede encontrar la ruta especificada. Al volver a ejecutar el programa, se encuentra el archivo. Esto sucede raramente, pero de una manera completamente aleatoria, lo que significa que no siempre Al volver a abrir el mismo archivo.
Mi teoría es que si se termina la transacción.Por Windows lleva mucho tiempo una vez, los archivos no están disponibles para abrirse en modo de lectura / escritura hasta La transacción termina. Mi programa falla cuando intento abrir Mis propios archivos en modo no transacción.
Creo que para evitar este problema, necesito esperar la transacción. para completar antes de volver a abrir los archivos. Sin embargo, no he encontrado ningún método documentado para hacerlo.
Respuestas
1 para la respuesta № 1No hay respuestas inteligentes, así que tuve que implementar mi propio dummy:
Si ocurre un error de E / S al abrir un archivo queestaba cerrado, La solución fue hacer un bucle en la apertura varias veces mientras se realizaba una llamada Sleep () para liberar la CPU, antes de decidir que se ha producido un error catastrófico.
Solución ficticia, pero solucionó el problema.