¿Cómo saber un archivo es copiado acabada
-
05-09-2019 - |
Pregunta
Estoy usando ReadDirectoryChangesW para espiar una carpeta, si yo estoy copiando un archivo grande a la carpeta, puedo recibir varios mensajes de FILE_ACTION_MODIFIED, parece cada vez ventanas escribe una gran parte del archivo, se obtiene el archivo modificado notificación para cada tiempo. He intentado utilizar la API CreateFile para comprobar si el archivo se puede abrir por AP o no, pero en algún momento, algunos de los archivos siempre están bloqueados por otro AP, por ejemplo, si va a abrir el Outlook, el PST se actualizará, pero mi punto de acceso puede 't acceder a ella, tenemos que empezar de instantáneas para abrirlo. Así que mi pregunta es, ¿cómo saber que un archivo se copia termine?
Solución
Esta es una solución de una naturaleza muy hacky, pero en una situación muy peludo se puede ejecutar un bucle de sondeo para comprobar el tamaño (o fecha de modificación) del archivo. Si no cambia durante un tiempo, puede algo asumir con seguridad que el archivo de la copia esté terminada.
EDIT: Esta no es la solución óptima en el caso medio, pero hay que considerar que en el caso de la OP mejores soluciones que se hayan descartado por las restricciones del problema. Piense en esto antes de pensar en downvoting.
Otros consejos
Cuando la encuesta en el tamaño del archivo, no utilice _stat/_stat64
. En su lugar, abra el archivo cada vez que necesite llamar y _filelengthi64
para obtener el tamaño del archivo. El tamaño del archivo que se devuelve por _stat64
no se actualiza en tiempo real por el sistema operativo Windows. También por ser capaz de abrir el archivo, que está probando a ver que se han completado las operaciones de copia de largo.
Windows proporciona una API para controlar el contenido de directorios de actualización. Puede utilizar el evento creado para detectar nuevo archivo, pero tenga en cuenta que este evento de disparo no necesariamente significa que el archivo es liberado todavía.
C ++ nativo especificaciones y código de ejemplo:
http://msdn.microsoft.com/ en-us / library / aa365261 (VS.85) .aspx
.net:
http://msdn.microsoft.com/en- es / library / system.io.filesystemwatcher.aspx