已使用python监视程序修改了检查特定文件

2024-06-07 08:09:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道如何检查文件夹下特定文件的更改。我发现watchdog模块可以检查文件夹中文件的更改,但我只需要一个文件(固定名称)。

请帮忙,谢谢。

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()

Tags: 模块文件path文件夹名称eventtrueclass
2条回答

您可以对watchdog.events.PatternMatchingEventHandler事件处理程序进行子类化,并对其进行修改,以便在发生事件时执行所需的任何操作。 您可以将模式设置为要监视的文件名。

不过,这个有点棘手。在封面下,它使用pathtools.patterns进行模式匹配。 它还将目录附加到要匹配的模式。这意味着您需要将文件的完整路径作为filename“pattern”参数传递给事件处理程序。 如果不这样做,则模式匹配将失败,并且不会收到任何事件通知。

下面是一个例子:

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)

执行watchdog python脚本(在修改文件之前):

(stackoverflow)[root@joeyoung.io 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

在单独的控制台中修改schedule.xml文件:

[root@joeyoung.io watchdog]# echo "I just modified this file" >> schedule.xml

修改schedule.xml后的结果:

(stackoverflow)[root@joeyoung.io 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

我想你可以根据

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

定义一个阈值并将当前时间与修改时间进行比较,可以知道文件是否已更新。如果不经常修改文件,这将起作用。

但不管怎样,如果有人打开文件,输入一些垃圾,然后删除并保存,就会出现错误警报。

相关问题 更多 >

    热门问题