无阻塞地捕获文件安全权限的变化

时间:2016-08-31 12:02:16

标签: python-2.7 file security pywin32 file-security

我希望在更改之前不加阻塞地更改文件的安全权限,就像更改时弹出的事件一样。

我也不想安装任何第三方模块或软件。

这个的主要要求是在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。

1 个答案:

答案 0 :(得分:0)

如果您不介意(或无法避免)添加一些线程开销,您可以启动一个单独的进程或线程,等待您已经拥有的阻止调用win32.ReadDirectoryChangesW()。当它收到更改时,它会将结果写入与GUI主线程共享的管道。

您的GUI可以在代码中的适当位置定期执行非阻塞读取(可能是您现在调用win32file.ReadDirectoryChangesW()的位置)。确保在读取之间等待一段时间,否则您的应用程序将花费100%的时间用于非阻塞读取。

您可以在this answer中看到如何以独立于操作系统的方式在管道上设置非阻塞读取。最后一位看起来像这样:

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:
            ...