Utilice FileSystemWatcher para inspeccionar cambios realizados en un directorio especificado. Es posible inspeccionar cambios en archivos y subdirectorios del directorio especificado. Puede crear un componente para inspeccionar archivos en un equipo local, una unidad de red o un equipo remoto.
Para inspeccionar los cambios en todos los archivos, establezca la propiedad Filter en una cadena vacía ("") o utilice caracteres comodín ("*.*"). Para inspeccionar un archivo específico, establezca la propiedad Filter en el nombre del archivo. Por ejemplo, para inspeccionar cambios en el archivo MyDoc.txt, establezca la propiedad Filter en "MyDoc.txt". También puede inspeccionar cambios en un determinado tipo de archivo. Por ejemplo, para inspeccionar cambios en archivos de texto, establezca la propiedad Filter en "*.txt".
Existen varios tipos de cambios que puede inspeccionar en un directorio o archivo. Por ejemplo, es posible inspeccionar cambios en los atributos (Attributes), la hora y la fecha de última escritura (LastWrite) o el tamaño (Size) de archivos o directorios. Esto se realiza mediante el establecimiento de la propiedad NotifyFilter en uno de los valores NotifyFilters. Para obtener más información acerca del tipo de cambios que pueden inspeccionarse, vea NotifyFilters.
Es posible inspeccionar el cambio de nombre, la eliminación o la creación de archivos o directorios. Por ejemplo, para inspeccionar el cambio de nombre de archivos de texto, establezca la propiedad Filter en "*.txt" y llame al método WaitForChanged especificando Renamed en su parámetro.
El sistema operativo Windows notifica al componente los cambios realizados en los archivos en un búfer creado por el objeto FileSystemWatcher. Si se producen muchos cambios en poco tiempo, el búfer se puede desbordar. Como consecuencia, el componente pierde el control de los cambios realizados en el directorio y sólo puede proporcionar una notificación general. El aumento del tamaño del búfer con la propiedad InternalBufferSize consume muchos recursos, ya que procede de la memoria no paginada que no se puede intercambiar con el disco, por lo que es conveniente mantener el búfer con el menor tamaño posible aunque lo suficientemente grande como para no perder ningún evento sobre los cambios que se realicen en los archivos. Para evitar un desbordamiento de búfer, utilice las propiedades NotifyFilter y IncludeSubdirectories con el fin de filtrar las notificaciones de cambio no deseadas.
Para obtener una lista con los valores de propiedad iniciales de una instancia de FileSystemWatcher, vea el constructor FileSystemWatcher.
Al utilizar la clase FileSystemWatcher, tenga en cuenta los siguientes extremos.
-
Los archivos ocultos no se omiten.
-
En algunos sistemas, FileSystemWatcher crea informes sobre los cambios realizados en los archivos utilizando el formato corto de nombre de archivo, 8.3. Por ejemplo, al crear un informe sobre un cambio en "LongFileName.LongExtension", éste podría aparecer como "LongFi~.Lon."
-
Esta clase contiene una petición de vínculo y una petición de herencia en el nivel de clase que se aplica a todos los miembros. Si el llamador inmediato o la clase derivada no dispone de permisos de plena confianza, se produce una excepción SecurityException. Para obtener más información sobre las peticiones de seguridad, vea Peticiones de vínculos.
Copiar y mover carpetas
El sistema operativo y el objeto FileSystemWatcher interpretan una acción de cortar y pegar o una acción de desplazamiento como una acción de cambio de nombre de una carpeta y su contenido. Si corta y pega una carpeta con archivos en una carpeta que se está inspeccionando, el objeto FileSystemWatcher informa sólo de que la carpeta es nueva, pero no informa de su contenido porque, básicamente, sólo se ha cambiado el nombre.
Para que se notifique si se ha movido o se o copiado el contenido de otras carpetas en una carpeta objeto de inspección, proporcione métodos controladores de eventos OnChanged y OnRenamed según se sugiere en la siguiente tabla.
| Controlador de eventos | Eventos controlados | Acción |
| OnChanged | Changed, Created, Deleted | Informa sobre cambios en los atributos de archivo, archivos creados y archivos eliminados. |
| OnRenamed | Renamed | Muestra las rutas de acceso anteriores y nuevas de los archivos y carpetas cambiados de nombre, expandiéndolas de manera recursiva si es necesario. |
Eventos y tamaños del búfer
Tenga en cuenta que hay varios factores que pueden influir en qué eventos de cambio en el sistema de archivos se generan, tal como se describe a continuación:
-
Las operaciones comunes en el sistema de archivos pueden provocar más de un evento. Por ejemplo, al cambiar un archivo de directorio, se pueden provocar varios OnChanged, algunos OnCreated y eventos OnDeleted. El cambio de un archivo de directorio es una operación compleja que se compone de varias operaciones sencillas y, por tanto, se provocan varios eventos. De forma similar, algunas aplicaciones (por ejemplo, software antivirus) pueden provocar eventos adicionales del sistema de archivos detectados por FileSystemWatcher.
-
FileSystemWatcher puede inspeccionar discos siempre y cuando no se intercambien o se quiten. FileSystemWatcher no genera eventos para CD y DVD, ya que las marcas de tiempo y las propiedades no pueden cambiar. Los equipos remotos deben tener instalada una de las plataformas necesarias para que el componente funcione correctamente.
-
Si hay varios objetos FileSystemWatcher inspeccionando la misma ruta de acceso UNC en una versión de Windows XP anterior a Service Pack 1, o en Windows 2000 SP2 o anterior, sólo uno de los objetos provocará un evento. En los equipos que ejecutan Windows XP SP1 y versiones más recientes, Windows 2000 SP3 o posterior, o Windows Server 2003, todos los objetos FileSystemWatcher provocan los eventos adecuados.
-
El establecimiento de Filter no reduce la cantidad de datos almacenados en el búfer.
Tenga en cuenta que, por dependencias con el sistema operativo Windows, FileSystemWatcher no provoca un evento Error cuando falta un evento o cuando se supera el tamaño del búfer. Para evitar la pérdida de eventos, siga estas instrucciones:
-
Si aumenta el tamaño del búfer mediante la propiedad InternalBufferSize puede evitar la pérdida de eventos de cambios en el sistema de archivos.
-
Evite inspeccionar archivos con nombres largos. Considere un cambio de nombres para utilizar nombres más cortos.
-
Mantenga el código para el control de eventos lo más corto posible.