¿Cómo distinguir si un archivo se está guardando o eliminando? ("Guardar" en MS Word elimina y vuelve a crear)

7

Mantengo una herramienta que sincroniza archivos entre una computadora cliente y un servidor de administración de documentos (usando CMIS protocolo). El historial de versiones (en el servidor CMIS) es importante.

Al guardar un documento localmente, MS Word :

  1. Escribe en un archivo temporal ~wrdxxxx.tmp
  2. Borra el archivo original Example.doc
  3. Renombra ~wrdxxxx.tmp a Example.doc

PROBLEMA: En el paso 2, mi herramienta de sincronización elimina el archivo en el servidor y pierde el historial de todas las versiones.

PREGUNTA: Desde el punto de vista de mi herramienta de sincronización, ¿hay alguna forma de saber si el archivo realmente se ha eliminado o si solo se está guardando?

Notas:

  • La espera probablemente no sea una buena solución, ya que no puedo estar seguro de cuánto tiempo toman los pasos 2 y 3.
  • La verificación de la presencia de los archivos ~wrdxxxx.tmp no funciona cuando se están editando varios documentos en la misma carpeta al mismo tiempo.
  • La herramienta funciona como Dropbox: los usuarios no tienen que "confirmar" los cambios, los archivos se sincronizan automáticamente lo antes posible.
pregunta Nicolas Raoul 30.04.2015 - 10:57

2 respuestas

7

Esto no es específico de "Word", el mismo problema puede ocurrir cuando alguien lo hace manualmente (hacer una copia de seguridad del archivo, cambiar el nombre o eliminar el original, restaurar una copia de seguridad, etc.) Su herramienta de sincronización no puede saber cuál de estos las operaciones son creaciones de documentos nuevos, o simplemente continuaciones de documentos existentes, y no puede administrar fácilmente el historial de versiones correctamente, ya que eso significaría que tenía que "leer" lo que el autor / editor toma como "uno" documento.

Por lo tanto, todas las herramientas de software VCS que conozco esperan que el usuario cree explícitamente una nueva revisión, elimine o cambie el nombre de los archivos explícitamente en el repositorio. Si está buscando una solución fácil de usar, vea cómo herramientas como TortoiseSVN o TortoiseGIT han resuelto ese problema.

  

En el paso 2, mi herramienta de sincronización elimina el archivo en el servidor, perdiendo todo el historial de versiones.

En caso de que aún quieras probar un enfoque "automático", ignora lo que escribí anteriormente: cuando se elimina un archivo en el cliente, ¿por qué es realmente importante eliminar el historial en el servidor? ¿No puedes simplemente marcarlo como "eliminado" como un estado especial, pero aún así mantener el historial? Cuando el archivo "vuelve a aparecer" en el siguiente ciclo de sincronización en el mismo lugar en el cliente, tiene que "revivir" el archivo, deshacer el estado "eliminado" y continuar el historial.

    
respondido por el Doc Brown 30.04.2015 - 12:49
3

Tienes dos cosas en tu contra:

Primero es una condición de carrera , donde el resultado de su operación de sincronización depende de la sincronización de Word y la de su proceso de sincronización. (Si está usando algo orientado a eventos, el tiempo es un poco más predecible, pero solo significa que va a eliminar su historial todo el tiempo en lugar de hacerlo a veces como lo haría si estuviera realizando una encuesta). usted observó, no hay manera de saber cuánto tiempo transcurrirá entre los pasos 2 y 3, por lo que esperar a ver si el archivo devuelve crearía otra condición de carrera.

Lo segundo es la incertidumbre acerca de si un archivo que ve como eliminado reaparecerá porque el sistema operativo no puede predecir qué hará una aplicación en el futuro. Tampoco puede decirle qué aplicación eliminó un archivo, que podría utilizar para llegar a una conclusión razonable de que el archivo podría reaparecer.

Si Word guarda los archivos de la forma que Microsoft describe, eso es un defecto en la implementación. Windows tiene llamadas a la API para hacer nombres atómicos que harían que el proceso fuera así:

  1. Crear archivo temporal ~wrdxxxx.tmp
  2. Cambia el nombre atómicamente de ~wrdxxxx.tmp a Example.doc

Debido a que el paso 2 es atómico, su programa de sincronización nunca vería que Example.doc desapareció, solo que sus atributos o contenido cambiaron.

El comportamiento de Word no es algo que puedas cambiar, por lo que esperar es realmente tu única opción.

Si el objetivo no es perder el historial de versiones, es mejor hacer eliminaciones provisionales y esperar un tiempo bastante largo (por ejemplo, 30 segundos) para que sean permanentes. Esto evitará la mayoría, pero no todos, los problemas causados por no saber cuánto tiempo lleva guardar. Obviamente, es posible que un guardado tarde tanto tiempo, pero probablemente sea raro. El problema más grande es que un período provisional lo suficientemente largo tratará una secuencia de eliminar / crear realizada por un humano en ese momento como un cambio de versión en lugar de lo que realmente fue. Esto no refleja la realidad de lo que sucedió, pero preservará el historial de versiones.

La pregunta que solo tú puedes responder es si tener una realidad distorsionada como esa en ocasiones relativamente raras es aceptable en la cara al no tener tu sincronizador en la historia.

    
respondido por el Blrfl 30.04.2015 - 13:28

Lea otras preguntas en las etiquetas