如何在一定间隔内检查文件是否被修改?

时间:2019-01-21 14:14:29

标签: python python-2.7 for-loop

我正在尝试使某些服务器功能自动化以进行工作,需要您的帮助。问题是我是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

我希望代码在3秒之前和之后比较f中的两个值,但是输出始终与预期不同。我该怎么办?

2 个答案:

答案 0 :(得分:0)

在不进行过多检查的情况下,在我看来,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,因此请注意https://docs.python.org/2/library/os.html#os.statstat的以下警告:

  

注意,st_atime,st_mtime和   st_ctime属性取决于操作系统和文件   系统。例如,在使用FAT或FAT32文件的Windows系统上   系统,st_mtime的分辨率为2秒,st_atime的分辨率为1天   解析度。有关详细信息,请参见您的操作系统文档。

答案 1 :(得分:0)

您需要将所有文件的更新时间分别存储在字典中,最好是在字典中。尝试类似的东西:

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