2016-08-31 8 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 및 하나의 파일. 어떻게하면됩니까? – justlittlequestion

+0

그리고 파이프에 쓰는다면 어쨌든 차단합니다. GUI 프로세스가 파이프에서 읽기를 기다리는 경우 아무것도 변경하지 않으면 블로킹 문제가 발생하기 때문입니다. – justlittlequestion

답변

0

일부 스레딩 오버 헤드를 추가해도 상관 없거나 피할 수없는 경우 이미 가지고있는 win32.ReadDirectoryChangesW()에 대한 차단 호출을 기다리는 별도의 프로세스 나 스레드를 시작할 수 있습니다. 변경 사항을 받으면 GUI의 메인 스레드와 공유되는 파이프에 결과를 씁니다.

사용자의 GUI는 코드의 적절한 지점 (아마도 win32file.ReadDirectoryChangesW())에서 비 차단 읽기를 주기적으로 실행할 수 있습니다. 읽기간에 약간 기다려야합니다. 그렇지 않으면 앱이 비 차단 읽기에 시간의 100 %를 소비합니다.

this answer에서는 OS 독립적 인 방식으로 파이프에서 논 블로킹 읽기를 설정하는 방법을 볼 수 있습니다. 마지막 비트는 다음과 같습니다.

+0

고마워요! 나는 이것을 사용하여 스레드를 사용하는 해킹 방법을 찾는다! – justlittlequestion