Как вы проверяете, были ли файлы изменены в определенный интервал? - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь автоматизировать некоторые функции сервера для работы и мне нужна ваша помощь. Проблема в том, что я очень плохо знаком с Python и ограничен Python 2.7.12 и не могу загружать внешние модули, такие как Watchdog. В настоящее время я работаю над Windows, и моя программа выглядит так:

import os, time

os.chdir("C:/Users/DummyPath")
path_to_watch = "C:/Users/DummyPath"

for f in os.listdir(path_to_watch):
    before = os.stat(f).st_mtime

while True:
    time.sleep(3)
    for f in os.listdir(path_to_watch):
        after = os.stat(f).st_mtime
        if after != before and f.endswith(".doc"):
            print(time.strftime("%d.%m.%Y %H:%M:%S // Updated: " + f))
        before = after

Я ожидаю, что код сравнивает два значения в f до и через 3 секунды, но результат всегда отличается от ожидаемого. Что мне делать?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Вам необходимо хранить время обновления для всех файлов отдельно, в идеале в словаре. Попробуйте что-то вроде:

import os, time

os.chdir("C:/Users/DummyPath")
path_to_watch = "C:/Users/DummyPath"
time_log = {}

for f in os.listdir(path_to_watch):
    time_log[f] = os.stat(f).st_mtime

while True:
    time.sleep(3)
    for f in os.listdir(path_to_watch):
        if f in time_log.keys():
            after = os.stat(f).st_mtime
            if after != time_log[f] and f.endswith(".doc"):
                print(time.strftime("%d.%m.%Y %H:%M:%S // Updated: " + f))
                time_log[f] = after
        else:
            print("New file: "+f)
            time_log[f] = os.stat(f).st_mtime
0 голосов
/ 21 января 2019

Не вдаваясь в слишком большую проверку, мне кажется, что before перезаписывается для каждого файла и всегда будет содержать только значение mtime для последнего файла в os.listdir().

Но на самом деле, зачем вообще нужен before? Если ваша цель - увидеть, изменился ли файл за последние 3 секунды, просто проверьте это:

import time 

check_interval = 3
while True:
    now = time.time()
    for f in os.listdir(path_to_watch):
        last_mod = os.stat(f).st_mtime
        if now - last_mod < check_interval:  # file changed in last N seconds
            print "File {} changed {} sec. ago".format(f, now - last_mod)
    time.sleep(check_interval)

(я не тестировал этот код, но концептуально это должно работать).

Кроме того, поскольку вы упомянули, что вы в Windows, обратите внимание на следующее предостережение на stat из https://docs.python.org/2/library/os.html#os.stat:

Примечание Точное значение и разрешение st_atime, st_mtime и Атрибуты st_ctime зависят от операционной системы и файла система. Например, в системах Windows, использующих файл FAT или FAT32 систем, st_mtime имеет разрешение 2 секунды, а st_atime имеет только 1 день разрешающая способность. Подробности смотрите в документации по вашей операционной системе.

...