首页 > 解决方案 > 如何使用看门狗知道文件何时下载?

问题描述

我有一个使用给定链接下载文件的功能。如果文件下载时间过长,脚本会报错。然后我添加了time.sleep(30) 但是等待可以在 1 秒内下载的小文件的时间太多了。像这样:

for link in links:
    download_function(link)
    time.sleep(30) ### I added this sleep but is to much to wait for small files.

    rest of the code
    .
    .

然后我想添加一个看门狗进程以了解文件实际下载的时间,然后继续执行其余代码。

我测试了以下代码本身可以正常工作,检查目录何时被修改并报告文件何时下载。

import sys
import logging
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler

## Watcher code
if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s - %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S')

    watchDirectory = '/Path/To/Directory/'

    event_handler = LoggingEventHandler()
    observer = Observer()
    observer.schedule(event_handler, watchDirectory, recursive=True)
    observer.start()
    try:
        while observer.isAlive():
            observer.join(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()


<ObservedWatch: path=/Path/To/Directory/, is_recursive=True>
2020-06-01 14:42:05 - Created file: /Path/To/Directory/somefile.pdf
2020-06-01 14:42:06 - Modified directory: /Path/To/Directory/

但我不知道使用看门狗代码(而不是 time.sleep(30))作为函数,以便等到文件下载后才能继续使用其余代码。

像这样的东西:

def download_complete(DirToWatch):
    Watcher code here
    .
    .

    download_complete = false

    If download_complete==true:
        stop watcher

    return true


for link in links:
    download_function(link)

    if download_complete(DirToWatch) == true:
        continue with rest of the code

    rest of the code
    .
    .

我怎样才能做到这一点?提前致谢。

标签: pythonpython-watchdog

解决方案


您可以使用它来监视当前文件夹中何时下载了文件:

from sys import argv
from time import sleep
from logging import basicConfig, INFO
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler

if __name__ == "__main__":
    basicConfig(level=INFO)
    path = argv[1] if len(argv) > 1 else '.'
    event_handler = LoggingEventHandler()
    obs = Observer()
    obs.schedule(event_handler, path, recursive=True)
    obs.start()
    obs.join()

推荐阅读