2015-08-31 1 views
4

Je voudrais savoir comment vérifier la modification d'un fichier spécifique sous un dossier. J'ai trouvé que le module chien de garde pouvait vérifier le changement des fichiers dans le dossier mais j'ai besoin d'un seul fichier (avec un nom fixe).Vérifier le fichier spécifique a été modifié en utilisant python watchdog

S'il vous plaît veuillez aider à ce sujet et merci.

class MyHandler(FileModifiedEvent): 
    def on_modified(self, event): 

if __name__ == "__main__": 
     integrity_file_path = DATASTORE_DIRECTORY_PATH + '/schedule.xml' 
     event_handler = MyHandler() 
     observer = Observer() 
     observer.schedule(MyHandler(), path=integrity_file_path,recursive=True) 
     observer.start() 

     try: 
      while True: 
       time.sleep(5) 
     except KeyboardInterrupt: 
      observer.stop() 
     observer.join() 

Répondre

0

Je dirais que vous pouvez vérifier la date de modification du fichier selon

How to get file creation & modification date/times in Python?

Définir un seuil et comparer l'heure actuelle avec la date de modification, vous pouvez savoir si le fichier est actualisé. Cela fonctionnerait si le fichier n'est pas modifié très fréquemment.

Mais de toute façon, il y aura une fausse alerte si quelqu'un a ouvert le fichier, a tapé des ordures puis les a supprimées et sauvegardées.

3

Vous pouvez sous-classer le gestionnaire d'événements watchdog.events.PatternMatchingEventHandler et le modifier pour faire ce que vous voulez dans le cas d'un événement. Vous devez définir le motif comme le nom de fichier que vous souhaitez surveiller.

Cependant, celui-ci est un peu difficile. Sous les couvertures, il utilise pathtools.patterns pour faire sa correspondance de modèle. Et il ajoute également le répertoire au motif correspondant. Ce qui signifie que vous aurez besoin de passer dans le gestionnaire d'événements le chemin complet de votre fichier comme nom de fichier "pattern" argument. Si ce n'est pas le cas, la correspondance de modèle échouera et vous n'obtiendrez aucune notification d'événement.

Voici un exemple ci-dessous:

import sys, os.path, time, logging 
from watchdog.observers import Observer 
from watchdog.events import PatternMatchingEventHandler 


class MyEventHandler(PatternMatchingEventHandler): 
    def on_moved(self, event): 
     super(MyEventHandler, self).on_moved(event) 
     logging.info("File %s was just moved" % event.src_path) 

    def on_created(self, event): 
     super(MyEventHandler, self).on_created(event) 
     logging.info("File %s was just created" % event.src_path) 

    def on_deleted(self, event): 
     super(MyEventHandler, self).on_deleted(event) 
     logging.info("File %s was just deleted" % event.src_path) 

    def on_modified(self, event): 
     super(MyEventHandler, self).on_modified(event) 
     logging.info("File %s was just modified" % event.src_path) 

def main(file_path=None): 
    logging.basicConfig(level=logging.INFO, 
     format='%(asctime)s - %(message)s', 
     datefmt='%Y-%m-%d %H:%M:%S') 
    watched_dir = os.path.split(file_path)[0] 
    print 'watched_dir = {watched_dir}'.format(watched_dir=watched_dir) 
    patterns = [file_path] 
    print 'patterns = {patterns}'.format(patterns=', '.join(patterns)) 
    event_handler = MyEventHandler(patterns=patterns) 
    observer = Observer() 
    observer.schedule(event_handler, watched_dir, recursive=True) 
    observer.start() 
    try: 
     while True: 
      time.sleep(1) 
    except KeyboardInterrupt: 
     observer.stop() 
    observer.join() 



if __name__ == "__main__": 
    if len(sys.argv) > 1: 
     path = sys.argv[1] 
     main(file_path=path.strip()) 
    else: 
     sys.exit(1) 

exécution du script python de chien de garde (avant de modifier le fichier):

(stackoverflow)[[email protected] stackoverflow]# python watchschedule.py /usr/local/src/stackoverflow/watchdog/schedule.xml 
watched_dir = /usr/local/src/stackoverflow/watchdog 
patterns = /usr/local/src/stackoverflow/watchdog/schedule.xml 

Modification du fichier schedule.xml dans une console séparée:

[[email protected] watchdog]# echo "I just modified this file" >> schedule.xml 

Résultats après modification du programme.xml:

(stackoverflow)[[email protected] stackoverflow]# python watchschedule.py /usr/local/src/stackoverflow/watchdog/schedule.xml 
watched_dir = /usr/local/src/stackoverflow/watchdog 
patterns = /usr/local/src/stackoverflow/watchdog/schedule.xml 
2015-08-31 19:30:31 - File /usr/local/src/stackoverflow/watchdog/schedule.xml was just modified 
+0

Cela fonctionne comme annoncé, merci. Comment est-ce que je devrais enlever le besoin d'entrer la structure de fichier dans la ligne de commande? Rien ne semble fonctionner. J'ai essayé les trois endroits les plus logiques dans la fonction principale. –

+0

@ElliotRobert Vous pouvez coder en dur le chemin du fichier. Sous la section 'if __name__ ==" __main __ ":', supprimez tout le bloc if-else et remplacez-le par un appel à la fonction 'main()', en passant votre chemin codé en argument à 'main()' . Par exemple: 'main (chemin_fichier = '/ usr/local/src/stackoverflow/watchdog/schedule.xml')' –

+0

Cela ne fonctionnait que pour le répertoire lui-même, y compris le nom de fichier provoquerait une erreur, je devais exécuter le Fonction .strip() sur le chemin d'accès complet avec le nom du fichier pour qu'il fonctionne. Merci un million de Joe. –