0

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

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

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

私は現在、この機能によるセキュリティの変更を監視しています:

    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がフリーズするため、ブロックしない必要があります。

4

1 に答える 1

0

スレッド化のオーバーヘッドを追加してもかまわない (または避けられない) 場合は、別のプロセスまたはスレッドを起動して、win32.ReadDirectoryChangesW()既に持っているブロッキング呼び出しを待機することができます。変更を受け取ると、GUI のメイン スレッドと共有されるパイプに結果を書き込みます。

GUI は、コード内の適切なポイント (おそらく、現在 を呼び出している場所win32file.ReadDirectoryChangesW()) で非ブロッキング読み取りを定期的に実行できます。読み取りの合間に少し待つようにしてください。そうしないと、アプリは 100% の時間をノンブロッキング読み取りに費やしてしまいます。

この回答では、OS に依存しない方法でパイプにノンブロッキング読み取りを設定する方法を確認できます。最終ビットは次のようになります。

try:  
    results = q.get_nowait()
except Empty:
    pass
else:  
    for line in results.splitlines():
        # Parse and use your result format
        ...
        if file_name == specific_file:
            ...
于 2016-08-31T13:55:56.037 に答える