0

ディレクトリが変更されたかどうかを確認するための(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を使用)より迅速な変更を検出する(クロスプラットフォームの)方法はありますか?

4

3 に答える 3

1

適切な方法は、変更をポーリングするのではなく、ディレクトリを監視することです。

FindFirstChangeNotification関数を確認してください。
ディレクトリの変更を監視するのはPythonの実装です。

ディレクトリ監視が十分に正確でない場合、おそらく唯一の代替手段はファイルシステムの呼び出しを傍受することです。

于 2009-10-09T09:42:33.350 に答える
1

ウォッチドッグ: http://packages.python.org/watchdog/quickstart.html

マルチプラットフォームの変更通知を行うのに適したプロジェクトです。

于 2011-12-05T14:27:37.663 に答える
0

これがLinuxの場合、inotifyを使用します。どうやらWindowsのinotifyに相当するものがあります-javajnotifyライブラリがそれを実装しています-しかし、Pythonの実装があるかどうかはわかりません

于 2009-10-09T09:44:45.080 に答える