2016-08-31 17 views
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。

+0

什么操作系统?显然Windows,但是什么版本?你需要观看多少个文件? (如果它只是一个,你总是可以启动一个单独的阻塞进程,写入管道等)。 – alexis

+0

Windows 7和只有一个文件。 我该怎么做? – justlittlequestion

+0

如果我编写管道它反正块,因为如果GUI进程等待从管道读取我进入阻塞问题,如果没有更改。 – justlittlequestion

回答

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

谢谢!我使用它,我发现一个hacky的方式也使用该线程! – justlittlequestion