Pregunta

Estoy creando una aplicación C# que monitoreará un directorio específico en busca de cambios y adiciones y almacenará la información en una base de datos.

Me gustaría evitar verificar cada archivo individual en busca de modificaciones, pero no estoy seguro de poder confiar completamente en el tiempo de acceso al archivo.

¿Cuál sería el mejor método a utilizar para obtener archivos modificados recientemente en un directorio?

Buscaría modificaciones sólo cuando el usuario lo solicite, no será un servicio en funcionamiento constante.

¿Fue útil?

Solución

Mmm...interesante pregunta.Inicialmente te señalaría el Vigilante del sistema de archivos clase.Sin embargo, si va a hacer que funcione a pedido del usuario, entonces parece que necesitará almacenar la información del directorio inicialmente y luego compararla cada vez que el usuario lo solicite.Probablemente elegiría un FileSystemWatcher y simplemente almacenaría los resultados de todos modos.

Otros consejos

Utilice el objeto FileSystemWatcher.Aquí hay un código para hacer lo que estás buscando.

    // Declares the FileSystemWatcher object
    FileSystemWatcher watcher = new FileSystemWatcher(); 

    // We have to specify the path which has to monitor

     watcher.Path = @"\\somefilepath";     

    // This property specifies which are the events to be monitored
     watcher.NotifyFilter = NotifyFilters.LastAccess |
       NotifyFilters.LastWrite | NotifyFilters.FileName | notifyFilters.DirectoryName; 
    watcher.Filter = "*.*"; // Only watch text files.

    // Add event handlers for specific change events...

    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;


    // Define the event handlers.
    private static void OnChanged(object source, FileSystemEventArgs e)
    {
    // Specify what is done when a file is changed, created, or deleted.
    }

    private static void OnRenamed(object source, RenamedEventArgs e)
    {
    // Specify what is done when a file is renamed.
    }

Creo que lo que quieres te lo proporciona el Vigilante del sistema de archivos clase.

Este tutorial describe cómo usarlo para monitorear un directorio en busca de cambios en un servicio simple de Windows; Cómo implementar un servicio simple de Windows de observación de archivos en C#

Si solo necesita verificar cuando el usuario pregunta y no todo el tiempo, no use FileSystemWatcher.Especialmente si se trata de un recurso compartido: lo último que desea es que 50 máquinas cliente vean el mismo directorio compartido.

Probablemente sea solo un error tipográfico, pero no debería mirar el tiempo de acceso al archivo, sino el tiempo de modificación del archivo para detectar los cambios.Incluso eso no es confiable.

Lo que haría es implementar algún tipo de función de suma de comprobación en la fecha del archivo y el tamaño de bytes, u otras propiedades del sistema de archivos.De esa manera no buscaría cambios en el archivo completo, solo sus propiedades y puedo hacerlo a pedido, en lugar de intentar mantener una conexión a un recurso remoto para monitorearlo.

Una solución más complicada sería hacerlo al revés e instalar un servicio en la máquina que aloja la unidad compartida que podría monitorear los archivos y tomar nota de los cambios.Entonces podrías consultar el servicio en lugar de tocar los archivos, pero probablemente sea excesivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top