Я использую 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() не блокирующий вызов
notepad++
файл открытым, т. е. можете ли вы открыть его в другой программе, пока он открытnotepad++
? - person jfs   schedule 24.02.2014os.startfile()
. и прослушайте изменения, сделанные в файле. --watchdog
(ваш код также может работать) . Кроме того, если ответ на последний вопрос из мой предыдущий комментарий - да, тогда вы можете просто попробоватьopen()
в цикле, пока он не добьется успеха (как заменительwatchdog
бедняка). - person jfs   schedule 24.02.2014ss.communicate()
не ждет в блокноте ++. Итак, он выполняет следующую строку кода и удаляет открытый файл. Как уже говорилось, один процесс notepad++ открывает множество файлов. Это можно решить, если каждый раз файл открывается в новом процессе. Но как вызвать новый процесс notepad++ - person imp   schedule 24.02.2014ss.communicate()
блокирует. Но чтобы выйти из этого, я должен закрыть блокнот++, а не просто закрыть открытый файл - person imp   schedule 24.02.2014ss.communicate()
или нет (просто используйтеos.startfile()
- он всегда возвращается, как только приложение запускается (оно не ждет завершения приложения)). Если вам нужно знать, когда безопасно удалить файл, просто попробуйте удалить его в цикле (со сном, чтобы избежать цикла занятости). Или, если вы знаете, какие изменения вам нужно отслеживать, удалите их в части мониторинга файлов вашего кода. - person jfs   schedule 24.02.2014ss.communicate()
говорит вам ничего в общем случае: он может вернуться до закрытия файла; он может вернуться через долгое время после закрытия файла. - person jfs   schedule 07.03.2014