title: Pywin32 Windows service reading directory
body: <p>I try to create a window service to monitor a directory.</p>
  
  <p>Here's my code, I can't make to stop the ReadDirectoryChange using windows service
  but rather after i stop  then change the path i monitor it will implement the stop.</p>
  
  <p>How can i achieve the following when i stop the windows service also the Read Directory Change also stop from monitoring?</p>
  
  <pre><code>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)
  </code></pre>