如何在Python中查找修改过的文件

2024-06-07 05:24:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我想监视一个文件夹,看看是否添加了新文件,或者修改了现有文件。问题是,不能保证我的程序会一直运行(因此,基于inotify的解决方案在这里可能不适合)。我需要缓存上次扫描的状态,然后与下一次扫描进行比较,然后再处理文件。在

在Python2.7中实现这一点有哪些替代方案?在

注1:处理这些文件是很昂贵的,所以我试图同时处理那些没有被修改的文件。因此,如果文件只是重命名的(与文件内容的更改相反),我也希望检测到它并跳过处理过程。在

注2:我只对Linux解决方案感兴趣,但如果添加其他平台的答案,我不会抱怨。在


Tags: 文件答案程序文件夹内容linux状态方案
3条回答

有几种方法可以检测文件中的更改。有些比较容易 比别人更傻。听起来这不是一个安全问题;更多 就像诚信是假设的,你只需要在没有 不得不智胜对手。在

你可以看看时间戳。如果不重命名文件,这是一个好方法 检测变化。如果它们被重命名,单独的时间戳不会 足以可靠地区分一个文件和另一个文件。os.stat会告诉你的 上次修改文件的时间。在

您可以查看inode,例如,ls -li。文件的inode编号可能会更改 如果更改涉及创建新文件并删除旧文件,则这是 例如,emacs通常如何更改文件。尝试更改文件 使用组织使用的标准工具,并比较以前的inode 但要记住,即使这次它没有改变,它 在某些情况下可能会改变。os.stat将告诉您inode 数字。在

你可以看看文件的内容。cksum计算一个小的CRC 文件上的校验和;如果有人想打败它很容易。这样的程序 当sha256sum计算安全哈希时,无法更改文件 不改变这样的散列。如果文件很大,这可能会很慢。 hashlib模块将计算几种安全哈希。在

如果文件被重命名和更改,并且其索引节点号发生更改,则 可能很难与以前的文件匹配 除非文件中的数据包含某种不可变的 唯一标识符。在

考虑并发性。有没有可能有人会改变 程序运行时的文件?小心比赛条件。在

我可能会使用某种sqlite解决方案,比如编写最后一次轮询时间。 然后,在每次这样的轮询中,按上次修改的时间(mtime)对文件进行排序,并获取mtime大于上一次轮询的所有文件(如果您坚持不要求这样的db,则此值将从sqlite或某种文件中取出)。在

监视新文件并不难——只需为目录中的所有文件保留一个索引节点列表或数据库。一个新文件将引入一个新的inode。这还可以帮助您避免处理重命名的文件,因为inode在重命名时不会更改。在

更困难的问题是监视文件更改。如果您还为每个inode存储文件大小,那么很明显,更改的大小表示文件已更改,您不需要打开和处理该文件就知道这一点。但是对于一个有(a)以前记录的inode,并且(b)与以前相同大小的文件,您需要处理该文件(例如,计算校验和)以了解它是否已更改。在

相关问题 更多 >