Python监视程序窗口等待复制完成

2024-06-06 14:14:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Windows2012服务器上的PythonWatchdog模块监视共享驱动器上出现的新文件。当监视程序注意到新文件时,它将启动数据库还原过程。

不过,看起来看门狗会在创建文件时尝试将其还原,而不是等到文件复制到共享驱动器完成。因此,我将事件更改为on_modified,但有两个on_modified事件,一个是文件最初被复制时,另一个是文件完成复制时。

如何处理两个on_modified事件,使其仅在复制到共享驱动器的文件完成时触发?

如果同时将多个文件复制到共享驱动器,会发生什么情况?

这是我的密码

import time
import subprocess
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

class NewFile(FileSystemEventHandler):
    def process(self, event):
        if event.is_directory:
            return

    if event.event_type == 'modified':            
        if getext(event.src_path) == 'gz':
            load_pgdump(event.src_path)

    def on_modified(self, event):
        self.process(event)

def getext(filename):
    "Get the file extension"
    file_ext = filename.split(".",1)[1]
    return file_ext

def load_pgdump(src_path):    
    restore = 'pg_restore command ' + src_path
    subprocess.call(restore, shell=True)

def main():
    event_handler = NewFile()
    observer = Observer()
    observer.schedule(event_handler, path='Y:\\', recursive=True)
    observer.start()

    try:
        while True:
            time.sleep(1)
    except keyboardInterrupt:
        observer.stop()
    observer.join()

if __name__ == '__main__':
    main()

Tags: 文件pathimportselfsrceventifon
3条回答

我想补充一点,因为这不是对你问题的回答,而是一种不同的方法。。。但我还没有足够的代表。您可以尝试监视文件大小,如果它停止更改,则可以假定复制已完成:

copying = True
size2 = -1
while copying:
    size = os.path.getsize('name of file being copied')
    if size == size2:
        break
    else:
        size2 = os.path.getsize('name of file being copied')
        time.sleep(2)

我最近也遇到过类似的问题。一个相当简单但不太聪明的解决方法是,我在while循环中使用两个元素列表检查文件大小的变化,一个用于“过去”,一个用于“现在”。一旦值相等,复制就完成了。

编辑:像这样的。

past = 0
now = 1
value = [past, now]
while True:
    # change

    # test
    if value[0] == value[1]:
        break
    else:
        value = [value[1], value[0]]

在on_modified事件中,只要通过监视文件大小,等到文件完成复制。

提供更简单的循环:

historicalSize = -1
while (historicalSize != os.path.getsize(filename)):
  historicalSize = os.path.getsize(filename)
  time.sleep(1)
print "file copy has now finished"

相关问题 更多 >