3

Windows 7 64 ビット python 2.7 を使用しています。ファイルを開き、ファイルの変更を監視してから、開いたファイルが閉じられるまで待機しています。これは、単純なメモ帳ファイル オープナーの場合にうまく機能します。メモ帳は新しいプロセスIDで各ファイルを開くのに対し、メモ帳++は単一のメモ帳++プロセスIDで異な​​るファイルを開きます。

ACTIONS = {
  1 : "Created",
  2 : "Deleted",
  3 : "Updated",
  4 : "Renamed from something",
  5 : "Renamed to something"
}
FILE_LIST_DIRECTORY = 0x0001

class myThread (threading.Thread):
    def __init__(self, threadID, fileName, directory, origin):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.fileName = fileName
        self.daemon = True
        self.dir = directory
        self.originalFile = origin
    def run(self):
        startMonitor(self.fileName, self.dir, self.originalFile)

def startMonitor(fileMonitoring,dirPath,originalFile):
    hDir = win32file.CreateFile (
      dirPath,
      FILE_LIST_DIRECTORY,
      win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE,
      None,
      win32con.OPEN_EXISTING,
      win32con.FILE_FLAG_BACKUP_SEMANTICS,
      None
    )
    readFlags = 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
    # Wait for new data and call ProcessNewData for each new chunk that's written
    while 1:
        # Wait for a change to occur
        results = win32file.ReadDirectoryChangesW (
                                                   hDir,
                                                   1024,
                                                   False,
                                                   readFlags,
                                                   None
                                                   )
        # For each change, check to see if it's updating the file we're interested in
        for action, file_M in results:
            full_filename = os.path.join (dirPath, file_M)
            #print file, ACTIONS.get (action, "Unknown")
            if len(full_filename) == len(fileMonitoring) and action == 3:
                #copy to main file
                if os.path.exists(originalFile):
                        encrypt_file(key,fileMonitoring,originalFile,iv)





thread1 = myThread(1, FileName, tempLocation,selectedFileName)
thread1.start();
startupinfo = None
if os.name == 'nt':
    startupinfo = subprocess.STARTUPINFO()
    startupinfo.dwFlags |= subprocess._subprocess.STARTF_USESHOWWINDOW
    **ss=subprocess.Popen(FileName,shell=True)**
    ss.communicate()
    os.remove(FileName)

したがって、上記のコードでは、開いているファイルタイプのみを閉じるのではなく、notepad ++を閉じると機能します(これにより、開いているすべての異なるファイルが閉じられますが、これは望ましくありません)。 ワードパッド/メモ帳でファイルを開くと、その各プロセスがファイルで作成されます。一方、notepad++ では、notepad++ の 1 つのプロセスだけがすべての異なるファイル タイプを運びます。したがって、新しいファイルを開くたびに、notepad++、msoffice、openoffice などのさまざまなタイプのファイル オープナーに対して新しいプロセス ID を呼び出す方法上記の場合、 ss.communicate()はブロッキング呼び出しではありません

4

0 に答える 0