2012-02-07 11 views
7

Tengo una carpeta en la que se copian los archivos. Quiero verlo y procesar archivos tan pronto como se copien en el directorio. Puedo detectar cuando un archivo está en el directorio, ya sea a través de sondeo (mi implementación actual) o en algunas pruebas que usan API de Windows a partir de algunas muestras que he encontrado en línea.Observación de C++ Directory - Cómo detectar que la copia ha finalizado

El problema es que detecto cuando el archivo se crea por primera vez y aún se está copiando. Esto hace que mi programa, que necesita acceder al archivo, a través de errores (porque el archivo aún no está completo). ¿Cómo puedo detectar no cuándo comenzó la copia sino cuándo terminó la copia? Estoy usando C++ en Windows, por lo que la respuesta puede depender de la plataforma, pero, de ser posible, preferiría que sea independiente de la plataforma.

+0

Encontré esta pregunta hace unos minutos: http://stackoverflow.com/questions/559659/how-to-know-a-file-is-finished-copying Es muy similar a mi problema, pero el "aprobado "La solución está lejos de ser elegante y funcional. – petersaints

+0

Si su código se ejecutará en un contexto administrativo, es decir, como un servicio del sistema, podría usar un diario de cambios. Consulte http://msdn.microsoft.com/en-us/library/windows/desktop/aa363798%28v=vs.85%29.aspx –

+0

Teniendo en cuenta la posibilidad de cosas como la copia ingenua usando 'fread()'/'fwrite() 'no creo que haya una solución general. No es bastante robusto, pero tal vez mediante el seguimiento de manijas abiertas a los archivos? –

Respuesta

4

Puede usar cualquiera de los archivos de bloqueo o una convención de nomenclatura especial. La más fácil es la última y funcionaría algo como esto:

Supongamos que desea mover un archivo llamado "fileA.txt" Al copiarlo en el directorio de destino, en su lugar, cópielo en "fileA.txt.partial" o algo como eso. Cuando se complete la copia, cambie el nombre del archivo de "archivoA.txt.partial" a "archivoA.txt". Entonces, la apariencia de "fileA.txt" es atómica en la medida en que el programa de observación puede ver.

La otra opción como se mencionó anteriormente es la de los archivos de bloqueo. Entonces cuando copias un archivo llamado "fileA.txt", primero creas un archivo llamado "fileA.txt.lock". Cuando haya terminado la copia, simplemente elimine el archivo de bloqueo. Cuando el programa de visualización vea "fileA.txt", debería verificar si existe "fileA.txt.lock", si lo hace, puede esperar o volver a visitar ese archivo en el futuro según sea necesario.

+2

Bueno, eso es una solución y podría funcionar en otros entornos. Pero en este caso, estoy hablando de archivos copiados por otros programas/a través del explorador de archivos a una carpeta que mi programa está viendo. En ese caso, este enfoque es muy difícil de lograr. – petersaints

+0

No estoy seguro si es posible si no tiene control sobre cómo se copian los archivos. –

2

No debería sondear. Use FindFirstChangeNotification (http://msdn.microsoft.com/en-us/library/windows/desktop/aa364417%28v=vs.85%29.aspx) para ver un directorio de cambios.

A continuación, utilice las funciones de espera (http://msdn.microsoft.com/en-us/library/windows/desktop/ms687069%28v=vs.85%29.aspx) para esperar a que se produzcan las notificaciones de cambio.

Descripción y ejemplos aquí: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365261%28v=vs.85%29.aspx

No estoy seguro de cómo presentar exactamente la finalización de escritura puede ser determinada. La respuesta de Evan Teran es una buena idea.

+0

Es exactamente porque votar no es una buena idea que estoy tratando de reemplazarlo por algo mejor;) ¡Y sí! Encontré esos métodos y ya tengo una solución basada en esto: http://code.google.com/p/simplefilewatcher/. El problema es determinar la finalización de la escritura del archivo. Esa biblioteca (que ya he modificado ligeramente) usa ReadDirectoryChangesW que creo que es incluso más poderosa que FindFirstChangeNotification. – petersaints

+0

En una nota lateral, me pregunto cómo Dropbox (por ejemplo) se ocupa de este tipo de problemas. – petersaints

+0

Puede intentar abrir el archivo para escritura exclusiva, que fallará hasta que la copia finalice. Probablemente haya una forma de bloquear esa condición, en lugar de sondearla, pero no lo sé de improviso. –

Cuestiones relacionadas