2016-08-31 1 views
0

変更が行われるまでポップアップするイベントのように、ブロックすることなくファイルのセキュリティ権限の変更をキャッチしたい。ブロッキングのないファイルのセキュリティ権限の変更をキャッチ

また、サードパーティのモジュールやソフトウェアをインストールしたくありません。

これの主な要件は、モジュールまたは組み込みモジュールの一部にあることです。

私は現在、この機能により、セキュリティの変更を見ている:

import win32con, win32file 
    def security_watcher(): 

     specific_file = "specific.ini" 
     path_to_watch = "." 
     FILE_LIST_DIRECTORY = 0x0001 
     hDir = win32file.CreateFile(path_to_watch, 
            FILE_LIST_DIRECTORY, 
            win32con.FILE_SHARE_READ | 
            win32con.FILE_SHARE_WRITE | 
            win32con.FILE_SHARE_DELETE, 
            None, 
            win32con.OPEN_EXISTING, 
            win32con.FILE_FLAG_BACKUP_SEMANTICS, 
            None) 
     results = win32file.ReadDirectoryChangesW(hDir, 
                1024, 
                False, 
                win32con.FILE_NOTIFY_CHANGE_SECURITY, 
                None, 
                None) 
     print results 
     for action, file_name in results: 
      if file_name == specific_file: 
       # wake another function to do something about that 

注:私はGUIアプリケーションでは、この機能を使用すると、それはGUIがフリーズするので、私はそれが非ブロックする必要があります。

+0

どのようなOSですか?明らかにWindowsですが、どのバージョンですか?いくつのファイルを見る必要がありますか? (それが単なるものであれば、パイプなどに書き込むブロッキングプロセスをいつでも開始できます) – alexis

+0

Windows 7と1つのファイル。 どうすればいいですか? – justlittlequestion

+0

そして、パイプに書き込むととにかくブロックされます。なぜなら、GUIプロセスがパイプからの読み込みを待つと、何も変更されていなければブロッキングの問題が発生するからです。 – justlittlequestion

答えて

0

スレッドオーバーヘッドを追加しても問題ない場合は、既に持っているwin32.ReadDirectoryChangesW()へのブロッキングコールを待つ別のプロセスまたはスレッドを起動できます。変更を受け取ると、GUIのメインスレッドと共有されるパイプに結果が書き込まれます。

あなたのGUIは、コード内の適切な時点(おそらくwin32file.ReadDirectoryChangesW()と呼ぶ場所)でノンブロッキング読み取りを定期的に実行することができます。読み込みの間にちょっと待ってください。そうしないと、アプリケーションは非ブロック読み込みに100%時間を費やします。

this answerで、パイプに非ブロック読み取りを設定する方法は、OSに依存しない方法で行うことができます。最後のビットは次のようになります:

+0

ありがとう!私はそれを使用して、私もスレッドを使用するためのハックな方法を見つける! – justlittlequestion

関連する問題