2009-03-09 13 views
6

Algo me intriga y no encuentro ningún recurso sobre esto.¿Cómo funciona FileSystemWatcher en otro directorio de computadoras?

¿Cómo puede saber FileSystemWatcher cuando se crea/elimina/cambia/renombra un archivo en una computadora "A"?

Pensé que esto funcionaba con sondeo, (el observador sondea el servidor para verificar la actualización), pero después de verificar la actividad de la red con Wireshark, vi que no se utilizaba el sondeo. ¿El protocolo SMB usa un patrón observable/observador?

En este caso, ¿cómo puede saber el servidor cuando un cliente ya no lo observa?

¿Cuál es la consecuencia cuando la red cae durante una observación y vuelve justo después?

Usando FileSystemWatcher en otro equipo parece demasiado fácil para ser verdad ...

Respuesta

8

Usando FileSystemWatcher en otro equipo parece demasiado fácil para ser verdad ...

Es un poco es. La API subyacente - ReadDirectoryChanges() - abre una conexión con el servidor, que es responsable de responder cuando algo cambia. Si se desconecta esa conexión por alguna razón o si se topa con el límite de conexión del sistema operativo al que se está conectando, entonces no recibirá notificaciones.

Descubrí que es más confiable realizar sondeos periódicamente (con un intervalo bastante largo), y usar FileSystemWatcher solo como una forma de responder rápidamente a los cambios entre las encuestas.

0

Creo FileSystemWatcher hace uso de un patrón de observador/observable basado en la API Win32 subyacente. No estoy seguro de los eventos reales pero, presumiblemente, cuando inicializa un objeto FileSystemWatcher para ver una ruta de red y establece la propiedad EnableRaisingEvents, se adjunta a la carpeta como observador uniéndose a los eventos generados por la API de Win32 como lo harían si la carpeta estaba en la misma computadora.

En el patrón de diseño del Observador, el sujeto (observable) nunca conoce el número o los tipos de observador, por lo tanto, el punto acerca de la otra computadora que sabe cuando el FSW ya no está mirando es irrelevante.

Si la red se cae durante un evento que se plantea es un poco de un gotcha - alguien más tendrá que ayudarlo allí.

Cuestiones relacionadas