2011-12-06 5 views
11

La función de la API de Windows CreateFile le permite especificar el acceso deseado. Hay tres opciones read, write and delete. Si obtiene un identificador de CreateFile solicitando Eliminar acceso, ¿cómo puede eliminar el archivo utilizando el identificador devuelto? La función DeleteFile toma el nombre del archivo, no el manejador.Eliminación o cambio de nombre de un archivo con un controlador abierto

Big Picture: Cuando guardo archivos de mi aplicación, primero escribo en un archivo temporal, luego borro el archivo "real" y renombro el archivo temporal al nombre real. Empecé a ver problemas con los indexadores de búsqueda, o anti virus/spyware abriendo el archivo para leer pero no permitiendo las eliminaciones. Esto hace que mi guardado falle al mover los archivos. He cambiado mi código abierto para solicitar acceso de eliminación para asegurarme de que puedo eliminar el archivo cuando llegue el momento de guardarlo.

Todo funciona bien, pero todavía tengo un espacio en el que una aplicación de terceros podría tomar mi archivo. Dado que tengo un control abierto para los archivos temporales y reales, estaba buscando una forma de realizar las funciones de eliminar y cambiar el nombre usando esos identificadores. La única opción que puedo encontrar es cerrar los identificadores y llamar a las funciones DeleteFile y MoveFile. En realidad, actualmente estoy usando la función ReplaceFile API para realizar esos pasos, pero también ha pasado nombres de archivo y no funcionará a menos que cierre mis identificadores primero.

Todavía necesito dar soporte a XP y no puedo comenzar a usar las nuevas funciones de archivo de transacción. ¿Hay alguna manera de mantener los archivos bloqueados y todavía eliminarlos/cambiarles el nombre?

Respuesta

6

En Windows Vista existe la función SetFileInformationByHandle, que puede hacer lo que necesita.

En versiones anteriores de Windows no existe tal función, pero tiene la función equivalente nativa, no del todo pública NtSetInformationFile.

No tengo experiencia con estas funciones, ni una máquina con Windows para probarlas, así que no puedo mostrar el código, pero eso no debería ser tan difícil.

Se aplica la exención de responsabilidad general sobre las funciones nativas de Windows, por supuesto.

+0

Gracias, eso es justo lo que necesitaba. –

Cuestiones relacionadas