Точность stat mtime в Windows - PullRequest
       36

Точность stat mtime в Windows

0 голосов
/ 09 октября 2009

Пример кода (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

Но сопровождающий юнит-тест случайным образом терпит неудачу, если я не добавлю хотя бы 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()

Действительно ли стат ограничен точностью хуже 1 секунды? (Изменить: очевидно, так, с FAT) Есть ли (кроссплатформенный) способ обнаружения более быстрых изменений?

Ответы [ 3 ]

1 голос
/ 05 декабря 2011

Watchdog: http://packages.python.org/watchdog/quickstart.html

Хороший проект с уведомлением об изменениях в нескольких платформах.

1 голос
/ 09 октября 2009

Правильный способ - смотреть каталог, а не запрашивать изменения.

Извлечь Функция FindFirstChangeNotification .
Просмотр каталога изменений - это реализация Python.

Если просмотр каталогов недостаточно точен, тогда, вероятно, единственная альтернатива - перехватывать вызовы файловых систем.

0 голосов
/ 09 октября 2009

если бы это был linux, я бы использовал inotify. очевидно, есть эквивалент Windows Inotify - java jnotify библиотека реализовал его - но я не знаю, есть ли реализация Python

...