我希望在更改之前不加阻塞地更改文件的安全权限,就像更改时弹出的事件一样。
我也不想安装任何第三方模块或软件。
这个的主要要求是在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 :(得分: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:
...