使用python看门狗检测移动目录的文件

如何解决使用python看门狗检测移动目录的文件

我正在尝试制作一个Python脚本,用看门狗监视文件夹并更新markdown文档中的链接。我目前正在使用python watchdog库来监视我的笔记本文件夹,但是遇到了问题。当我重命名文件时,它会触发预期的on_moved函数,但是如果我将文件从一个目录移动到另一个目录中,则会触发on_deleted函数,然后很快调用on_created功能。对于我的项目,如果文件被删除或刚刚移动,我希望能够做一些单独的事情。目前,我不知道如何区分要删除的文件和刚刚移动的文件。

下面是我要使用的代码。

# Import all plugins and configure them
import time
import os
import fileinput
import logging
import watchdog.events
import watchdog.observers
from lazydog.handlers import HighlevelEventHandler
from watchdog.observers import Observer  
from watchdog.events import PatternMatchingEventHandler

# Define all variables
Notebooks = "C:\\Notebooks"
file_type = ".md"
alert_file = "C:\\Notebooks\\ALERT.md"
last_deleted_path = "NOT SET YET"
last_deleted_file = "NOT SET YET"
last_created_path = "NOT SET YET"
last_created_file = "NOT SET YET"
last_renamed_path = "NOT SET YET"
last_renamed_file = "NOT SET YET"
current_path = "NOT SET YET"
current_file = "NOT SET YET"
replaced_link = "NOT SET YET"
replacement_link = "NOT SET YET"

class Handler(watchdog.events.PatternMatchingEventHandler):
    def __init__(self): 
        # Set the patterns for PatternMatchingEventHandler 
        watchdog.events.PatternMatchingEventHandler.__init__(self,patterns=['*.md'],ignore_directories=False,case_sensitive=False)

    def on_deleted(self,event):
        # Enter variables in scope
        global last_deleted_path
        global last_deleted_file

        print("The file [" + event.src_path + "] was deleted.")
        last_deleted_path = event.src_path                      # Log the last deleted path to the last_deleted_path variable
        last_deleted_file = os.path.basename(event.src_path)    # Log the last deleted file not including the path

        replaced_link = last_deleted_path                       # We want to replace this link      
        created()
    def on_created(self,event):
        # Enter variables in scope
        global last_deleted_path
        global last_deleted_file
        global last_created_path
        global last_created_file

        print(event.src_path + " triggered on_created")
        last_created_path = event.src_path                      # Log the last deleted path to the last_deleted_path variable
        last_created_file = os.path.basename(event.src_path)    # Log the last deleted file not including the path   

        if last_deleted_file == last_created_file:              # The file was moved and not a new file
            print("\n")
            print("The file: " + last_created_file + " was moved from " + last_deleted_path + " to " + last_created_path)
            print("\n")
            search_and_replace()
        else:                                                   # This is a brand new file
            nothing()
    def on_modified(self,event):
        nothing()
    def on_moved(self,event):          # When a event is "moved" it is renamed. When a event is moved it is deleted then created.
        # Enter variables in scope
        global last_renamed_path
        global last_renamed_file
        global current_path
        global current_file

        print(event.src_path + " triggered on_moved")
        last_renamed_path = event.src_path                      # Log the last renamed path to the last_renamed_path variable
        last_renamed_file = os.path.basename(event.src_path)    # Log the last renamed file not including the path
        current_path = event.dest_path                          # Log the current path to the current_path variable
        current_file = os.path.basename(event.dest_path)        # Log the current file not including the path

        search_and_replace()

if __name__ == "__main__": 
    src_path = Notebooks
    event_handler = Handler() 
    observer = watchdog.observers.Observer() 
    observer.schedule(event_handler,path=src_path,recursive=True) 
    observer.start() 
    try: 
        while True: 
            time.sleep(1) 
    except KeyboardInterrupt: 
        observer.stop() 
        observer.join()

def search_and_replace():
    files = []
    for r,d,f in os.walk(Notebooks):                          # For all the root,directories,and files in path... (r=root,d=directories,f = files) put them in files
        for files in f:
            if file_type in files:
                files.append(os.path.join(r,files))
    for i in files:                                             # For all the files search for the link and replace it
        with fileinput.FileInput(i,inplace=True) as file:
            for line in file:
                print(line.replace(replaced_link,replacement_link),end='')
def search_and_alert():
    files = []
    for r,f in os.walk(Notebooks):                          # Scan recursivly all the files in the target notebook folder (r=root,f = files)
        for files in f:
            if file_type in files:
                files.append(os.path.join(r,files))
    for i in files:                                             # For all the .md files search for the link
        reading_file = open(i,"r")                             # Open the file
        data = reading_file.read()                              # Read content of the file
        occurrences = data.count(last_deleted_path)             # Get number of occurrences of the link in the file

        if occurrences != 0:                                    # This note has at least one deleted link,so append a note to ALERT.md
            file1 = open(alert_file,"a")
            file1.write("\n\nThe file " + last_deleted_path + " was deleted. This affects the file(s) " + files + ". The link occured " + occurrences + " times.") 
            file1.close()
        else:                                                   # This note does not have the deleted link so just keep going
            continue
def created():
    if last_deleted_file == last_created_file:              # This will be false if the file was moved
        nothing()
    else:                                                   # This file was just deleted not moved
        search_and_alert()
def nothing():
    print()

首先感谢您的所有帮助:)

-Cal

解决方法

您可以存储文件名与删除时间的哈希图。
每当删除文件时,都可以在哈希图中创建一个条目。
调用create listener时,我们可以检查此文件的删除是否在0.5秒前完成。如果是,那么这是一个举动。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-