Evaluar y enviar comentarios
This page is specific to
Microsoft Visual Studio 2008/.NET Framework 3.5

Other versions are also available for the following:
Biblioteca de clases de .NET Framework
FileSystemWatcher (Clase)

Escucha las notificaciones de cambio del sistema de archivos y provoca eventos cuando cambia un directorio o un archivo de un directorio.

Espacio de nombres:  System.IO
Ensamblado:  System (en System.dll)

Visual Basic (Declaración)
<IODescriptionAttribute("FileSystemWatcherDesc")> _
<PermissionSetAttribute(SecurityAction.InheritanceDemand, Name := "FullTrust")> _
<PermissionSetAttribute(SecurityAction.LinkDemand, Name := "FullTrust")> _
Public Class FileSystemWatcher _
    Inherits Component _
    Implements ISupportInitialize
Visual Basic (Uso)
Dim instance As FileSystemWatcher
C#
[IODescriptionAttribute("FileSystemWatcherDesc")]
[PermissionSetAttribute(SecurityAction.InheritanceDemand, Name = "FullTrust")]
[PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
public class FileSystemWatcher : Component, ISupportInitialize
Visual C++
[IODescriptionAttribute(L"FileSystemWatcherDesc")]
[PermissionSetAttribute(SecurityAction::InheritanceDemand, Name = L"FullTrust")]
[PermissionSetAttribute(SecurityAction::LinkDemand, Name = L"FullTrust")]
public ref class FileSystemWatcher : public Component, 
    ISupportInitialize
J#
/** @attribute IODescriptionAttribute("FileSystemWatcherDesc") */
/** @attribute PermissionSetAttribute(SecurityAction.InheritanceDemand, Name = "FullTrust") */
/** @attribute PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust") */
public class FileSystemWatcher extends Component implements ISupportInitialize
JScript
public class FileSystemWatcher extends Component implements ISupportInitialize

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.

En el siguiente ejemplo se crea un objeto FileSystemWatcher para inspeccionar el directorio especificado en tiempo de ejecución. El componente se establece para inspeccionar los cambios en la hora de última escritura (LastWrite) y último acceso (LastAccess), así como la creación, la eliminación o el cambio de nombre de los archivos de texto del directorio. Si se cambia, se crea o se elimina un archivo, la ruta del archivo se imprimirá en la consola. Cuando se cambia el nombre de un archivo, tanto la antigua ruta de acceso y como la nueva aparecen en la consola.

Se utilizan los espacios de nombres System.Diagnostics y System.IO para este ejemplo.

Visual Basic
Public Class Watcher

    Public Shared Sub Main()
    
         Run()

    End Sub

    <PermissionSet(SecurityAction.Demand, Name:="FullTrust")> _
    Private Shared Sub Run

      Dim args() As String = System.Environment.GetCommandLineArgs()
        ' If a directory is not specified, exit the program.
        If args.Length <> 2 Then
            ' Display the proper way to call the program.
            Console.WriteLine("Usage: Watcher.exe (directory)")
            Return
        End If

        ' Create a new FileSystemWatcher and set its properties.
        Dim watcher As New FileSystemWatcher()
        watcher.Path = args(1)
        ' Watch for changes in LastAccess and LastWrite times, and
        ' the renaming of files or directories. 
        watcher.NotifyFilter = (NotifyFilters.LastAccess Or NotifyFilters.LastWrite Or NotifyFilters.FileName Or NotifyFilters.DirectoryName)
        ' Only watch text files.
        watcher.Filter = "*.txt"

        ' Add event handlers.
        AddHandler watcher.Changed, AddressOf OnChanged
        AddHandler watcher.Created, AddressOf OnChanged
        AddHandler watcher.Deleted, AddressOf OnChanged
        AddHandler watcher.Renamed, AddressOf OnRenamed

        ' Begin watching.
        watcher.EnableRaisingEvents = True

        ' Wait for the user to quit the program.
        Console.WriteLine("Press 'q' to quit the sample.")
        While Chr(Console.Read()) <> "q"c
        End While
    End Sub

    ' Define the event handlers.
    Private Shared Sub OnChanged(source As Object, e As FileSystemEventArgs)
        ' Specify what is done when a file is changed, created, or deleted.
        Console.WriteLine("File: " & e.FullPath & " " & e.ChangeType)
    End Sub    

    Private Shared Sub OnRenamed(source As Object, e As RenamedEventArgs)
        ' Specify what is done when a file is renamed.
        Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath)
    End Sub

End Class


C#
public class Watcher
{

    public static void Main()
    {
    Run();

    }

    [PermissionSet(SecurityAction.Demand, Name="FullTrust")]
    public static void Run()
    {
        string[] args = System.Environment.GetCommandLineArgs();

        // If a directory is not specified, exit program.
        if(args.Length != 2)
        {
            // Display the proper way to call the program.
            Console.WriteLine("Usage: Watcher.exe (directory)");
            return;
        }

        // Create a new FileSystemWatcher and set its properties.
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = args[1];
        /* Watch for changes in LastAccess and LastWrite times, and 
           the renaming of files or directories. */
        watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
           | NotifyFilters.FileName | NotifyFilters.DirectoryName;
        // Only watch text files.
        watcher.Filter = "*.txt";

        // Add event handlers.
        watcher.Changed += new FileSystemEventHandler(OnChanged);
        watcher.Created += new FileSystemEventHandler(OnChanged);
        watcher.Deleted += new FileSystemEventHandler(OnChanged);
        watcher.Renamed += new RenamedEventHandler(OnRenamed);

        // Begin watching.
        watcher.EnableRaisingEvents = true;

        // Wait for the user to quit the program.
        Console.WriteLine("Press \'q\' to quit the sample.");
        while(Console.Read()!='q');
    }

    // Define the event handlers.
    private static void OnChanged(object source, FileSystemEventArgs e)
    {
        // Specify what is done when a file is changed, created, or deleted.
       Console.WriteLine("File: " +  e.FullPath + " " + e.ChangeType);
    }

    private static void OnRenamed(object source, RenamedEventArgs e)
    {
        // Specify what is done when a file is renamed.
        Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
    }
}


Visual C++
public ref class Watcher
{
private:
   // Define the event handlers.
   static void OnChanged( Object^ /*source*/, FileSystemEventArgs^ e )
   {
      // Specify what is done when a file is changed, created, or deleted.
      Console::WriteLine( "File: {0} {1}", e->FullPath, e->ChangeType );
   }

   static void OnRenamed( Object^ /*source*/, RenamedEventArgs^ e )
   {
      // Specify what is done when a file is renamed.
      Console::WriteLine( "File: {0} renamed to {1}", e->OldFullPath, e->FullPath );
   }

public:
   [PermissionSet(SecurityAction::Demand, Name="FullTrust")]
   int static run()
   {
      array<String^>^args = System::Environment::GetCommandLineArgs();

      // If a directory is not specified, exit program.
      if ( args->Length != 2 )
      {
         // Display the proper way to call the program.
         Console::WriteLine( "Usage: Watcher.exe (directory)" );
         return 0;
      }

      // Create a new FileSystemWatcher and set its properties.
      FileSystemWatcher^ watcher = gcnew FileSystemWatcher;
      watcher->Path = args[ 1 ];

      /* Watch for changes in LastAccess and LastWrite times, and 
          the renaming of files or directories. */
      watcher->NotifyFilter = static_cast<NotifyFilters>(NotifyFilters::LastAccess |
            NotifyFilters::LastWrite | NotifyFilters::FileName | NotifyFilters::DirectoryName);

      // Only watch text files.
      watcher->Filter = "*.txt";

      // Add event handlers.
      watcher->Changed += gcnew FileSystemEventHandler( Watcher::OnChanged );
      watcher->Created += gcnew FileSystemEventHandler( Watcher::OnChanged );
      watcher->Deleted += gcnew FileSystemEventHandler( Watcher::OnChanged );
      watcher->Renamed += gcnew RenamedEventHandler( Watcher::OnRenamed );

      // Begin watching.
      watcher->EnableRaisingEvents = true;

      // Wait for the user to quit the program.
      Console::WriteLine( "Press \'q\' to quit the sample." );
      while ( Console::Read() != 'q' )
         ;
   }
};

int main() {
   Watcher::run();
}

J#
public class Watcher
{
    public static void main(String[] args1)
    {
    Run();
    } 

    /** @attribute PermissionSet(SecurityAction.Demand, Name="FullTrust")
     */
    public static void Run()
    {
        String args[] = System.Environment.GetCommandLineArgs();

        // If a directory is not specified, exit program.
        if (args.length != 2) {

            // Display the proper way to call the program.
            Console.WriteLine("Usage: Watcher.exe (directory)");
            return;
        }

        // Create a new FileSystemWatcher and set its properties.
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.set_Path(args[1]);

        /* Watch for changes in LastAccess and LastWrite times, and 
           the renaming of files or directories.
         */
        watcher.set_NotifyFilter
            (NotifyFilters.LastAccess |NotifyFilters.LastWrite |
            NotifyFilters.FileName | NotifyFilters.DirectoryName);

        // Only watch text files.
        watcher.set_Filter("*.txt");

        // Add event handlers.
        watcher.add_Changed(new FileSystemEventHandler(OnChanged));
        watcher.add_Created(new FileSystemEventHandler(OnChanged));
        watcher.add_Deleted(new FileSystemEventHandler(OnChanged));
        watcher.add_Renamed(new RenamedEventHandler(OnRenamed));

        // Begin watching.
        watcher.set_EnableRaisingEvents(true);

        // Wait for the user to quit the program.
        Console.WriteLine("Press \'q\' to quit the sample.");
        while ((Console.Read() != 'q')) {

        }
    }

    // Define the event handlers.
    private static void OnChanged(Object source,FileSystemEventArgs e)
    {
        // Specify what is done when a file is changed, created, or deleted.
        Console.WriteLine(("File: " + e.get_FullPath() + " " 
            + e.get_ChangeType()));
    } //OnChanged

    private static void OnRenamed(Object source, RenamedEventArgs e)
    {
        // Specify what is done when a file is renamed.
        Console.WriteLine("File: {0} renamed to {1}",
            e.get_OldFullPath(),e.get_FullPath());
    } //OnRenamed
} //Watcher

System..::.Object
  System..::.MarshalByRefObject
    System.ComponentModel..::.Component
      System.IO..::.FileSystemWatcher
Todos los miembros static (Shared en Visual Basic) públicos de este tipo son seguros para la ejecución de subprocesos. No se garantiza que los miembros de instancias sean seguros para la ejecución de subprocesos.

Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98

.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.

.NET Framework

Compatible con: 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0, 1.1, 1.0
Contenido de la comunidad   ¿Qué es Community Content?
Agregar contenido nuevo      
Processing
© 2008 Microsoft Corporation. Reservados todos los derechos. Términos de uso  |  Marcas Registradas  |  Privacidad
Page view tracker