Question

Je suis en train de construire une application C # qui surveillera les changements et les ajouts dans un répertoire spécifié et stockera les informations dans une base de données.

Je voudrais éviter de vérifier chaque fichier individuel pour des modifications, mais je ne suis pas sûr de pouvoir faire totalement confiance au temps d'accès au fichier.

Quelle serait la meilleure méthode à utiliser pour récupérer des fichiers récemment modifiés dans un répertoire?

Il ne vérifiera les modifications que lorsque l'utilisateur le lui demandera, ce ne sera pas un service constamment opérationnel.

Était-ce utile?

La solution

Hmm ... question intéressante. Dans un premier temps, je vous indiquerais la FileSystemWatcher . . Si vous voulez que cela fonctionne, cependant, à la demande de l'utilisateur, il vous semblera peut-être nécessaire de stocker initialement les informations de l'annuaire, puis de les comparer chaque fois que l'utilisateur le demande. J'irais probablement avec un FileSystemWatcher et juste stocker vos résultats quand même.

Autres conseils

Utilisez l'objet FileSystemWatcher. Voici du code pour faire ce que vous cherchez.

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

Je pense que ce que vous voulez est fourni par la FileSystemWatcher classe.

Ce didacticiel explique comment l’utiliser pour surveiller les modifications apportées à un répertoire dans un service Windows simple. Comment implémenter un service Windows Filewatcher simple en C #

Si vous avez seulement besoin de vérifier quand l'utilisateur le demande plutôt que tout le temps, n'utilisez pas FileSystemWatcher. Surtout s'il s'agit d'une ressource partagée - la dernière chose que vous souhaitiez, c'est 50 ordinateurs clients surveillant le même répertoire partagé.

C'est probablement juste une faute de frappe, mais vous ne devriez pas regarder l'heure d'accès au fichier, mais plutôt l'heure de modification du fichier pour prendre en compte les changements. Même ce n'est pas fiable.

Ce que je ferais, c’est d’implémenter une sorte de fonction de somme de contrôle sur la date du fichier et la taille en octets, ou d’autres propriétés du système de fichiers. De cette façon, je ne chercherais pas à modifier le fichier complet, mais uniquement ses propriétés. Je peux le faire sur demande, plutôt que d'essayer de conserver une connexion à une ressource distante pour le surveiller.

Une solution plus lourde consisterait à procéder à l’inverse et à installer un service sur la machine hébergeant le lecteur partagé, capable de surveiller les fichiers et de prendre note des modifications. Ensuite, vous pouvez interroger le service plutôt que de toucher les fichiers - mais c'est probablement trop cher.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top