os.stat(path).st_mtime 实际上是如何获得文件修改时间的?

How does os.stat(path).st_mtime actually get file modified time?

在这个例子中,我使用 Python 3.6.5 安装使用 pyenv 在 OSX shell.

我一直在玩弄一些文件监视代码的概念证明,我认为使用文件当前和上次测量的增量 st_mtime 足以 "detect" 文件具有改变了。

代码:

import os


def main():
    file_path = 'myfile.txt'
    last_modified = os.stat(file_path).st_mtime
    while True:
        check_last_modified = os.stat(file_path).st_mtime
        delta = check_last_modified - last_modified

        if delta != 0.0:
            print("File was modified.")

        last_modified = check_last_modified



if __name__ == '__main__':
    main()

奇怪的是不同类型的基本文件修改操作会导致 "File was modified." 打印不止一次。

假设 myfile.txt 存在,我根据操作得到不同数量的打印:

它打印 1 次:$ touch myfile.txt

它打印 2 次:$ echo "" > myfile.txt

它打印 1 次:

$ cat <<EOF > myfile.txt
> EOF

打印 2 次(空行):

$ cat <<EOF > myfile.txt
>
> EOF

使用python写空字符串打印1次:

def main():
    with open('myfile.txt', 'w') as _file:
        _file.write('')

if __name__ == '__main__':
    main()

使用python写非空字符串打印2次:

def main():
    with open('myfile.txt', 'w') as _file:
        _file.write('a')

if __name__ == '__main__':
    main()

最大的区别似乎是存在一个字符串而不是换行符,但是看到 echo 命令如何导致两次打印,我不倾向于相信它以任何方式绑定到那个.

有什么想法吗?

您的循环是一个繁忙的等待循环,因此它可以非常快速地捕获多个时间变化。

当 python 创建文件 (open) 时 sets/updates 创建时间。

但关闭文件时创建时间会再次更新。这解释了您捕获了 2 次更新。

touch 只设置一次修改时间,但是 echo 和你的 python 脚本一样:当 creating/opening 现有文件时设置修改时间,并设置关闭时再次显示。

繁忙的循环和 open/close 操作创建了竞争条件,您看到的时间更新次数未定义(这说明您的脚本在 cat 命令中错过了一个更新,其中数据小)