Как открывать файл в новом процессе каждый раз, независимо от файлового открывателя

Я использую Windows 7 64-битный Python 2.7. Я открываю файл и отслеживаю изменения файла, а затем жду, пока открытый файл не будет закрыт. Это хорошо работает в случае простого открытия файла блокнота. Поскольку блокнот открывает каждый файл в новом идентификаторе процесса, тогда как блокнот ++ открывает разные файлы в одном идентификаторе процесса блокнота ++.

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)

Таким образом, приведенный выше код работает, когда я закрываю блокнот ++ (который закроет все разные открытые файлы, что нежелательно), а не закрывает только открытый тип файла. Когда я открываю файл с помощью wordpad/блокнота, каждый его процесс создается с файлом. В то время как в notepad++ только один процесс notepad++ поддерживает все типы файлов. Итак, как вызывать новый идентификатор процесса для различных типов открывателей файлов, таких как notepad++, msoffice, openoffice, каждый раз, когда он открывает новый файл. В приведенном выше случае ss.communicate() не блокирующий вызов


person imp    schedule 22.01.2014    source источник
comment
Возможно, у notepad++ есть некоторые параметры командной строки, которые обновляют текстовую область. Насколько я помню, он спрашивает, следует ли обновлять текстовую область, когда он снова получает фокус.   -  person User    schedule 22.01.2014
comment
Какова цель всего сценария? Вы хотите узнать, когда внешнее приложение работает с файлом, который вы ему даете? Оставляет ли notepad++ файл открытым, т. е. можете ли вы открыть его в другой программе, пока он открыт notepad++?   -  person jfs    schedule 24.02.2014
comment
@ J.F.Sebastian Если notepad ++ является вашим приложением по умолчанию для открытия любого текстового файла, то он откроет его на другой вкладке, но существует только один процесс notepad ++, даже если открыто несколько файлов. Итак, я хочу запустить отдельный процесс notepad++ для каждого файла. Точно так же, если для файла .docx ms word является приложением по умолчанию, то оно инициирует отдельный процесс msword. Моя цель - открыть любой тип файла с помощью приложения по умолчанию и прослушать изменения, внесенные в файл.   -  person imp    schedule 24.02.2014
comment
@winterfall: Моя цель — открывать файлы любого типа в приложении по умолчанию -- os.startfile(). и прослушайте изменения, сделанные в файле. -- watchdog (ваш код также может работать) . Кроме того, если ответ на последний вопрос из мой предыдущий комментарий - да, тогда вы можете просто попробовать open() в цикле, пока он не добьется успеха (как заменитель watchdog бедняка).   -  person jfs    schedule 24.02.2014
comment
@ J.F.Sebastian J.F.Sebastian, пожалуйста, посмотрите код, ss.communicate() не ждет в блокноте ++. Итак, он выполняет следующую строку кода и удаляет открытый файл. Как уже говорилось, один процесс notepad++ открывает множество файлов. Это можно решить, если каждый раз файл открывается в новом процессе. Но как вызвать новый процесс notepad++   -  person imp    schedule 24.02.2014
comment
@ J.F.Sebastian Я использую собственный файловый монитор Windows. Если я закрою notepad++. А затем ОТКРЫТЬ файл с помощью nodepad++, ss.communicate() блокирует. Но чтобы выйти из этого, я должен закрыть блокнот++, а не просто закрыть открытый файл   -  person imp    schedule 24.02.2014
comment
Я не понимаю, почему вас волнует, блокирует ли ss.communicate() или нет (просто используйте os.startfile() - он всегда возвращается, как только приложение запускается (оно не ждет завершения приложения)). Если вам нужно знать, когда безопасно удалить файл, просто попробуйте удалить его в цикле (со сном, чтобы избежать цикла занятости). Или, если вы знаете, какие изменения вам нужно отслеживать, удалите их в части мониторинга файлов вашего кода.   -  person jfs    schedule 24.02.2014
comment
@ J.F.Sebastian и послушайте изменения, сделанные в файле, как, поскольку процесс не ждет. Он завершается, как только файл открывается, и удаляет файл. Вот почему я использовал ss.communicate(), чтобы подождать, пока файл не будет закрыт, а затем завершить процесс.   -  person imp    schedule 02.03.2014
comment
ss.communicate() говорит вам ничего в общем случае: он может вернуться до закрытия файла; он может вернуться через долгое время после закрытия файла.   -  person jfs    schedule 07.03.2014