首页 > 解决方案 > 修改文件系统时如何打印正确的文件名?

问题描述

在这段代码中,我正在监视文件系统。每当我修改文件时,event.src_path不显示文件名。相反,它显示.goutputstream-CL5N00. 我不知道出了什么问题?

给定结果

event type: modified path : /home/bilal/Videos/folder1/fd/.goutputstream-CL5N00

预期结果

event type: modified path : /home/bilal/Videos/folder1/fd/touch

代码

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

class MyHandler(FileSystemEventHandler):

    def on_modified(self, event):
        print(f'event type: {event.event_type} path : {event.src_path}')

def monitor_folders(path):
    event_handler = MyHandler()
    observer = Observer()
    observer.schedule(event_handler, path, recursive=True)
    observer.start()

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

folder1 = '/home/bilal/Videos/folder1'

if __name__ == "__main__":
    m1 = monitor_folders(folder1)
    m1.start()
    m1.join()

标签: pythonpython-3.x

解决方案


您没有在您的问题中提供足够的信息来说明您指定的路径下的文件正在发生什么变化。它可能是一个文本编辑器,其中许多会写入备份文件、写入新文件、执行文件交换等。它可能是创建或移动文件的其他程序(您的代码不会检测到)。

使用 mv、cp、touch 等 shell 命令是测试看门狗与测试编辑器相比更可靠的方法。另请参阅描述 vim 行为的这个问题。

你也在reddit/r/learnpythoncodeproject上问过这个问题,并透露你正在使用“默认的 Linux 文本编辑器”,它似乎是在创建备份文件,当你尝试 SublimeText 时,一切都按预期工作,可能是因为 SublimeText 使用了其他一些目录用于备份。带有 pytest 模块的 VSCode 使用 ./pytest_cache 下的文件

除了提供更多信息之外,您还可以使用系统中的更多信息。看门狗包有一个 FileSystemEventHandler 有一个 on_any_event 函数:

class Handler(FileSystemEventHandler):

@staticmethod
def on_any_event(event):
    desc = ""
    if event.is_directory:
        desc += "Directory "
    else:
        desc += "File "

    if event.event_type == "moved":
        desc += f"moved {event.src_path}"
    elif event.event_type == "deleted":
        desc += f"deleted {event.src_path}"
    elif event.event_type == "created":
        desc += f" created {event.src_path}"
    elif event.event_type == "modified":
        desc += f"modified {event.src_path}"
    elif event.event_type == "closed":
        desc += f"closed {event.src_path}"
    else:
        desc = f"UNEXPECTD {desc} {event.event_type} {event.src_path}"

    print(desc)

有时通过将自己限制在仅类型的事件(修改),您会错过可能告诉您使用错误工具测试系统的其他事件。


推荐阅读