Предисловие: Это мой первый пост о переполнении стека, так что извините, если в какой-то момент я не соблюдаю надлежащие соглашения о том, как правильно задавать вопросы сообществу / ссылки на другие статьи о переполнении стека, где я получил указание.
Мне был назначен рабочий проект, в котором необходимо отслеживать каталог для каких-либо изменений, а при возникновении действия генерируется электронное письмо и отправляется соответствующим сторонам, которые управляют directory.
Использование Tim Golden's Python Материал: просмотр каталога изменений (с небольшими изменениями) и публикация под названием Как получить дату последнего изменения файла в Python Я смог использовать Python, чтобы собрать воедино некоторый код, который непрерывно контролирует каталог и успешно возвращает действия, которые произошли с соответствующей отметкой времени, когда каталог последний раз изменялся (отметка времени недостаточно рафинированный, чтобы быть настолько гранулированным, что задает точное время каждого действия, а скорее приписывает время последнего действия в папке всем действиям (что не идеально).
Я застрял на следующих шагах о том, как go об обработке запуск автоматического c уведомления по электронной почте (с использованием MS Outlook), когда происходит какое-либо действие.
Я просматривал сайт и вижу возможные решения, а именно: Уведомление по электронной почте об изменении файла в определенном каталоге с Python, однако я надеялся на решение, которое могло бы работать с моими существующими code.
Любые идеи, предложения или рекомендации будут с благодарностью. Заранее спасибо.
Вот то, что у меня пока есть:
import os
import win32file
import win32con
from datetime import datetime
lastmodified= os.stat("generic path of directory").st_mtime
timestamp = (datetime.fromtimestamp(lastmodified))
ACTIONS = {
1 : "FILE_ACTION_ADDED",
2 : "FILE_ACTION_REMOVED",
3 : "FILE_ACTION_MODIFIED",
4 : "FILE_ACTION_RENAMED_OLD_NAME",
5 : "FILE_ACTION_RENAMED_NEW_NAME",
8 : "FILE_NOTIFY_CHANGE_SIZE",
10 : "FILE_NOTIFY_CHANGE_LAST_WRITE",
20 : "FILE_NOTIFY_CHANGE_CREATION",
40 : "FILE_NOTIFY_CHANGE_CREATION",
100 : "FILE_NOTIFY_CHANGE_SECURITY"
}
# Thanks to Claudio Grondi for the correct set of numbers
FILE_LIST_DIRECTORY = 0x0001
path_to_watch = "generic path of directory"
hDir = win32file.CreateFile (
path_to_watch,
FILE_LIST_DIRECTORY,
win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE | win32con.FILE_SHARE_DELETE,
None,
win32con.OPEN_EXISTING,
win32con.FILE_FLAG_BACKUP_SEMANTICS,
None
)
while 1:
#
# ReadDirectoryChangesW takes a previously-created
# handle to a directory, a buffer size for results,
# a flag to indicate whether to watch subtrees and
# a filter of what changes to notify.
#
# NB Tim Juchcinski reports that he needed to up
# the buffer size to be sure of picking up all
# events when a large number of files were
# deleted at once.
#
results = win32file.ReadDirectoryChangesW (
hDir,
1024,
True,
win32con.FILE_NOTIFY_CHANGE_FILE_NAME |
win32con.FILE_NOTIFY_CHANGE_DIR_NAME |
win32con.FILE_NOTIFY_CHANGE_ATTRIBUTES |
win32con.FILE_NOTIFY_CHANGE_SIZE |
win32con.FILE_NOTIFY_CHANGE_LAST_WRITE |
win32con.FILE_NOTIFY_CHANGE_SECURITY,
None,
None
)
for action, file in results:
full_filename = os.path.join (path_to_watch, file)
print (full_filename, ACTIONS.get (action, "Unknown"),timestamp)