有一个示例(Python)代码来检查目录是否已更改:
import os
def watch(path, fdict):
"""Checks a directory and children for changes"""
changed = []
for root, dirs, files in os.walk(path):
for f in files:
abspath = os.path.abspath(os.path.join(root, f))
new_mtime = os.stat(abspath).st_mtime
if not fdict.has_key(abspath) or new_mtime > fdict[abspath]:
changed.append(abspath)
fdict[abspath] = new_mtime
return fdict, changed
但随附的unittest随机失败,除非我加入至少2秒的睡眠时间:
import unittest
import project_creator
import os
import time
class tests(unittest.TestCase):
def setUp(self):
os.makedirs('autotest')
f = open(os.path.join('autotest', 'new_file.txt'), 'w')
f.write('New file')
def tearDown(self):
os.unlink(os.path.join('autotest', 'new_file.txt'))
os.rmdir('autotest')
def test_amend_file(self):
changed = project_creator.watch('autotest', {})
time.sleep(2)
f = open(os.path.join('autotest', 'new_file.txt'), 'a')
f.write('\nA change!')
f.close()
changed = project_creator.watch('autotest', changed[0])
self.assertEqual(changed[1], [os.path.abspath(os.path.join('autotest', 'new_file.txt'))])
if __name__ == '__main__':
unittest.main()
stat是否真的限制在1秒以内? (编辑:显然是这样,有FAT) 是否有任何(跨平台)方式来检测更快速的变化?
答案 0 :(得分:1)
正确的方式是观察目录而不是轮询更改。
查看FindFirstChangeNotification Function Watch a Directory for Changes是一个Python实现。
如果目录观察不够准确,那么可能唯一的办法是拦截文件系统调用。
答案 1 :(得分:1)
看门狗: http://packages.python.org/watchdog/quickstart.html
是一个很好的项目,可以进行一些多平台变更通知。
答案 2 :(得分:0)
如果这是linux,我会使用inotify。显然有一个windows inotify等价 - java jnotify library已实现它 - 但我不知道是否有python实现