我想监视一个文件夹,看看是否添加了任何新文件,或者是否修改了现有文件。问题是,我不保证我的程序会一直运行(因此,基于inotify
的解决方案可能不适合这里)。我需要缓存上次扫描的状态,然后在下一次扫描时,我需要在处理文件之前将其与上一次扫描进行比较。
在Python 2.7中实现这一目标有哪些替代方案?
注意1:处理文件很昂贵,所以我正在尝试处理同时未修改的文件。因此,如果仅重命名文件(而不是文件内容的更改),我还想检测并跳过处理。
注意2:我只对Linux解决方案感兴趣,但如果添加其他平台的答案,我不会抱怨。
答案 0 :(得分:1)
监视新文件并不困难 - 只需保留目录中所有文件的inode列表或数据库。一个新文件将引入一个新的inode。这也可以帮助您避免处理重命名的文件,因为inode在重命名时不会更改。
更难的问题是监控文件更改。如果您还存储每个inode的文件大小,那么显然更改的大小表示已更改的文件,您不需要打开并处理该文件以了解该文件。但对于具有(a)先前记录的inode的文件,以及(b)与之前相同的大小,您将需要处理该文件(例如,计算校验和)以了解它是否已更改。
答案 1 :(得分:1)
有多种方法可以检测文件中的更改。有些更容易 傻瓜比别人。听起来这不是一个安全问题;更多 假设有诚意,你只需要在没有的情况下检测变化 不得不战胜对手。
您可以查看时间戳。如果没有重命名文件,这是一个好方法
检测变化。如果它们被重命名,那么单独的时间戳就不会
足以可靠地告诉另一个文件。 os.stat
会告诉你
文件上次修改的时间。
您可以查看inode,例如ls -li
。文件的inode编号可能会更改
如果更改涉及创建新文件并删除旧文件;这是
例如,emacs
通常如何更改文件。尝试更改文件
使用组织使用的标准工具,并比较之前的inode
之后;但请记住,即使这次不改变,它也是如此
在某些情况下可能会改变。 os.stat
会告诉你inode
号。
您可以查看文件的内容。 cksum
计算一个小CRC
校验和文件;如果有人愿意,它很容易被击败。程序等
as sha256sum
计算安全哈希;更改文件是不可行的
没有改变这样的哈希。如果文件很大,这可能会很慢。
hashlib
模块将计算几种安全哈希值。
如果文件被重命名和更改,并且其inode编号发生变化,则会发生变化 可能很难将其与以前的文件相匹配 除非文件中的数据包含某种不可变的和 唯一标识符。
考虑并发性。有人可能会改变一个 程序运行时的文件?小心竞争条件。
答案 2 :(得分:0)
我可能会选择某种sqlite解决方案,例如写下最后一次轮询时间。 然后在每个这样的轮询上,按last_modified_time(mtime)对文件进行排序,并获取所有mtime大于上一次轮询的人(如果你坚持没有要求,这个值将从sqlite或某种文件中取出这样的数据库)。
答案 3 :(得分:0)
我建议作弊并使用系统find命令。例如,以下内容查找在过去60分钟内已修改或创建的所有Python文件。使用ls
输出可以确定是否需要进一步检查。
$ echo beer > zoot.py
$ find . -name '*.py' -mmin -60 -type f -ls
1973329 4 -rw-r--r-- 1 johnm johnm 5 Aug 30 15:17 ./zoot.py