检查特定文件是否已使用python watchdog修改
我想知道如何检查文件夹下特定文件的更改。我发现看门狗模块可以检查文件夹中文件的更改,但我只需要一个文件(具有固定名称) 请帮忙,谢谢检查特定文件是否已使用python watchdog修改,python,file,watchdog,Python,File,Watchdog,我想知道如何检查文件夹下特定文件的更改。我发现看门狗模块可以检查文件夹中文件的更改,但我只需要一个文件(具有固定名称) 请帮忙,谢谢 class MyHandler(FileModifiedEvent): def on_modified(self, event): if __name__ == "__main__": integrity_file_path = DATASTORE_DIRECTORY_PATH + '/schedule.xml' even
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()
我想你可以根据我的要求检查文件的修改时间 定义阈值并将当前时间与修改时间进行比较,您可能知道文件是否已更新。如果文件没有被超频繁修改,这将起作用 但无论如何,如果有人打开文件,输入一些垃圾,然后删除并保存,就会出现错误警报 您可以对事件处理程序进行子类化,并对其进行修改,以便在发生事件时执行任何操作。 您可以将模式设置为要监视的文件名 然而,这个有点棘手。在它用来进行模式匹配的封面下。 它还将目录附加到匹配的模式。这意味着您需要将文件的完整路径作为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)
执行看门狗python脚本(在修改文件之前):
在单独的控制台中修改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
这是广告宣传的,谢谢。如何在命令行中输入文件结构?似乎什么都不管用。我在主函数中尝试了三个最符合逻辑的位置。@ElliotRobert您可以对文件路径进行硬编码。在
if\uuuu name\uuuu==“\uuuuu main\uuuuu”:
部分下,删除整个if-else块,并将其替换为调用main()
函数,将硬编码路径作为参数传递给main()
。例如:main(file_path='/usr/local/src/stackoverflow/watchdog/schedule.xml')
这只对其自身所在的目录有效,包括文件名会导致错误,我必须在具有文件名的完整路径上运行.strip()函数才能工作。非常感谢,乔。
(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