2008-09-21 15 views
6

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

Me gustaría evitar comprobar cada archivo individual para las modificaciones, pero no estoy seguro de si puedo confiar completamente en el tiempo de acceso al archivo.

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

Revisaría las modificaciones solo cuando el usuario lo solicite, no será un servicio en funcionamiento constante.

+0

¿Tiene un servicio siempre en ejecución, o desea que el programa recupere archivos recientemente modificados en cada ejecución sin monitorear constantemente el sistema de archivos? Por favor, aclara la pregunta. –

Respuesta

1

Hmm ... pregunta interesante. Inicialmente te señalaría en la clase FileSystemWatcher. Sin embargo, si va a hacer que funcione, a solicitud del usuario, parecería que necesita almacenar inicialmente la información del directorio y luego comparar cada vez que el usuario lo solicite. Probablemente iría con un FileSystemWatcher y almacenaría tus resultados de todos modos.

6

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. 
    } 
1

Si sólo necesita para comprobar cuando el usuario pide en lugar todo el tiempo, no utilice el FileSystemWatcher. Especialmente si se trata de un recurso compartido: lo último que desea es 50 máquinas cliente que miran el mismo directorio compartido.

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

Lo que haría sería implementar algún tipo de función de suma de comprobación en la fecha del archivo y el tamaño del byte u otras propiedades del sistema de archivos. De esa forma no buscaría cambios en el archivo completo, solo las propiedades del mismo y puedo hacerlo a petición, en lugar de tratar de mantener una conexión con un recurso remoto para monitorearlo.

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

Cuestiones relacionadas