37 lines
1.0 KiB
Python
37 lines
1.0 KiB
Python
import collections
|
|
import os
|
|
import re
|
|
import time
|
|
|
|
|
|
def watch(folders, on_change, pattern=None, sleep_time=0.1):
|
|
pattern = re.compile(pattern) if pattern else None
|
|
watched = collections.defaultdict(lambda: -1)
|
|
|
|
def walk():
|
|
walked = []
|
|
for folder in folders:
|
|
for current, _, files in os.walk(folder):
|
|
for f in files:
|
|
if pattern and not pattern.search(f):
|
|
continue
|
|
path = os.path.join(current, f)
|
|
|
|
info = os.stat(path)
|
|
new_time = info.st_mtime
|
|
|
|
if new_time > watched[path] > 0:
|
|
on_change(path, new_time, False)
|
|
|
|
watched[path] = new_time
|
|
walked.append(path)
|
|
|
|
# Look for deleted files
|
|
for w in [x for x in watched.keys() if x not in walked]:
|
|
del watched[w]
|
|
on_change(w, -1, True)
|
|
|
|
while True:
|
|
walk()
|
|
time.sleep(sleep_time)
|