2015-12-05 2 views
0

Я пытаюсь создать сервис окна для мониторинга каталога.Pywin32 Каталог чтения служебных программ Windows

Вот мой код, я не могу сделать, чтобы остановить ReadDirectoryChange, используя службу Windows , но после того, как я остановился, измените путь, на котором я контролирую, он будет реализовывать остановку.

Как я могу добиться следующего, когда я остановлю службу Windows, также, если Read Directory Change также прекратит мониторинг?

import os 
import sys 
import win32serviceutil 
import win32service 
import win32event 
import win32file,win32api 
import win32con 
import socket, string 
import time 
import logging 
import ConfigParser 

logging.basicConfig(
    filename = 'c:\\Temp\\Log.log', 
    level = logging.INFO, 
    filemode='w', 
    format='%(asctime)s %(message)s', 
    datefmt='%m/%d/%Y %I:%M:%S %p' 

) 

Config = ConfigParser.ConfigParser() 
Config.read("c:\\Temp\\KerrSMS.ini") 

path_to_watch = "C:\Users\Admin\Documents\PRAII Email Notification\PRAII Email Notification\path" 

ACTIONS = { 
    1 : "Created", 
    2 : "Deleted", 
    3 : "Updated", 
    4 : "Renamed from something", 
    5 : "Renamed to something" 
} 
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 
) 

def ConfigSectionMap(section): 
    dict1 = {} 
    options = Config.options(section) 
    for option in options: 
     try: 
      dict1[option] = Config.get(section, option) 
      if dict1[option] == -1: 
       DebugPrint("skip: %s" % option) 
     except: 
      print("exception on %s!" % option) 
      dict1[option] = None 
    return dict1 


class PraClient (win32serviceutil.ServiceFramework): 
    _svc_name_ = "Pra-Service-v1.0.2" 
    _svc_display_name_ = "PraClient-Service-v1.0.2" 
    _svc_description_ = 'Pra Client' 

    def __init__(self,args): 
     win32serviceutil.ServiceFramework.__init__(self,args) 
     self.stop_event = win32event.CreateEvent(None,0,0,None) 
##  socket.setdefaulttimeout(60) 
     self.stop_requested = False 

    def SvcStop(self): 
     self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
     win32event.SetEvent(self.stop_event) 
     #logging.info('Stopping service ...') 
     self.stop_requested = True 

    def SvcDoRun(self): 
     import servicemanager 
##  servicemanager.LogMsg(
##   servicemanager.EVENTLOG_INFORMATION_TYPE, 
##   servicemanager.PYS_SERVICE_STARTED, 
##   (self._svc_name_,'') 
##  ) 
     rc = None 
     while rc != win32event.WAIT_OBJECT_0: 
      self.main() 
      # block for 5 seconds and listen for a stop event 
      rc = win32event.WaitForSingleObject(self.stop_event, 5000) 
     logging.info('Stopping service ...') 


     #self.main() 

    def main(self): 
##  rc = None 
##  while rc != win32event.WAIT_OBJECT_0: 
     try: 
      """ 
      This is where the magic happens. 
      """ 
      results = win32file.ReadDirectoryChangesW (
       hDir, 
       1024, 
       True, 
       win32con.FILE_NOTIFY_CHANGE_FILE_NAME | 
       win32con.FILE_NOTIFY_CHANGE_DIR_NAME | 
       #win32con.FILE_NOTIFY_CHANGE_ATTRIBUTES | 
       win32con.FILE_NOTIFY_CHANGE_SIZE | 
       # win32con.FILE_NOTIFY_CHANGE_LAST_WRITE | 
       win32con.FILE_NOTIFY_CHANGE_SECURITY, 
       None, 
       None 
      ) 
      for action, file in results: 
       full_filename = os.path.join (path_to_watch, file) 
       #print full_filename, ACTIONS.get (action, "Unknown"), "By " + win32api.GetUserName() 
       msglog = full_filename + " " + ACTIONS.get (action, "Unknown"), " By " + win32api.GetUserName() 
       #praLogger.appendLog(msglog) 
       logging.info(msglog[0]+msglog[1]) 
       s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
       s.connect(('localhost', 9999)) 
       s.sendall(msglog[0]+msglog[1]) 
       #s.sendall(full_filename + ACTIONS.get (action, "Unknown") + win32api.GetUserName()) 
       #thread = threading.Thread(target=notify,args=(msglog,)) 
       #thread.start() 
       #thread.join() 

      #s.sendall("hello world" + "\n") 
      #time.sleep(2) 
     except socket.error as e: 
      logging.info("socket error {} reconnecting".format(e)) 


##  while 1: 
##   rc = win32event.WaitForSingleObject(self.stop_event, 3000) 
##   if rc == win32event.WAIT_OBJECT_0: 
##    # Stop signal encountered 
##    logging.info('Stopping service ...') 
##    break 
##   else: 
##    try: 
##     """ 
##     This is where the magic happens. 
##     """ 
##     results = win32file.ReadDirectoryChangesW (
##      hDir, 
##      1024, 
##      True, 
##      win32con.FILE_NOTIFY_CHANGE_FILE_NAME | 
##      win32con.FILE_NOTIFY_CHANGE_DIR_NAME | 
##      #win32con.FILE_NOTIFY_CHANGE_ATTRIBUTES | 
##      win32con.FILE_NOTIFY_CHANGE_SIZE | 
##      # win32con.FILE_NOTIFY_CHANGE_LAST_WRITE | 
##      win32con.FILE_NOTIFY_CHANGE_SECURITY, 
##      None, 
##      None 
##     ) 
##     for action, file in results: 
##      full_filename = os.path.join (path_to_watch, file) 
##      #print full_filename, ACTIONS.get (action, "Unknown"), "By " + win32api.GetUserName() 
##      msglog = full_filename + " " + ACTIONS.get (action, "Unknown"), " By " + win32api.GetUserName() 
##      #praLogger.appendLog(msglog) 
##      logging.info(msglog[0]+msglog[1]) 
##      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
##      s.connect(('localhost', 9999)) 
##      s.sendall(msglog[0]+msglog[1]) 
##      #s.sendall(full_filename + ACTIONS.get (action, "Unknown") + win32api.GetUserName()) 
##      #thread = threading.Thread(target=notify,args=(msglog,)) 
##      #thread.start() 
##      #thread.join() 
## 
##     #s.sendall("hello world" + "\n") 
##     #time.sleep(2) 
##    except socket.error as e: 
##     logging.info("socket error {} reconnecting".format(e)) 
##     #time.sleep(5) 
##    #else: 
##     #break 


if __name__ == '__main__': 
    win32serviceutil.HandleCommandLine(PraClient) 

ответ

0

Я, наконец, понял это, создав временный файл внутри патча, который я наблюдал.

Смежные вопросы