如何让file watcher找到指定文件后停止并触发SQL存储过程?
解决方案
核心修改点
要实现找到目标文件后停止监控并执行SQL存储过程,需添加目标文件匹配逻辑和循环终止条件,同时修正原代码中变量不一致的问题(原函数参数为my_dir,但内部误用了watchDirectory)。
修改后的完整代码
import time import re # 用于匹配带时间戳的文件名模式 def fileWatcher(my_dir: str, pollTime: int): # 定义目标文件匹配规则:以Process1_开头、.txt结尾,中间为任意格式的时间戳 target_pattern = re.compile(r'^Process1_.*\.txt$') # 首次扫描文件列表,处理程序启动时目标文件已存在的场景 previousFileList = fileInDirectory(my_dir) print('首次扫描文件列表:') print(previousFileList) # 先检查首次扫描结果中是否有目标文件 for file_name in previousFileList: if target_pattern.match(file_name): print(f"找到目标文件:{file_name}") execute_sql_stored_procedure(file_name) return # 找到后直接退出监控 # 进入循环监控 while True: time.sleep(pollTime) newFileList = fileInDirectory(my_dir) fileDiff = listComparison(previousFileList, newFileList) previousFileList = newFileList if len(fileDiff) == 0: continue # 遍历新增文件,检查是否包含目标文件 for file_name in fileDiff: if target_pattern.match(file_name): print(f"找到目标文件:{file_name}") execute_sql_stored_procedure(file_name) return # 终止循环并退出监控 # 若新增的不是目标文件,可继续执行原有处理逻辑(可选保留) doThingsWithNewFiles(fileDiff) # 示例SQL存储过程执行函数(需根据实际数据库环境实现) def execute_sql_stored_procedure(file_name: str): # 替换为你的数据库连接及存储过程调用逻辑 # 例如使用pyodbc连接SQL Server,或pymysql连接MySQL print(f"正在执行SQL存储过程,导入文件:{file_name}")
关键说明
- 文件名匹配:用正则表达式精准识别
Process1_Timestamp.txt格式的文件,若时间戳有固定格式(如数字、特定日期格式),可调整正则表达式进一步缩小匹配范围。 - 首次扫描检查:避免程序启动时目标文件已存在但未被处理的遗漏情况。
- 循环终止:找到目标文件后调用
return直接退出监控函数,彻底停止循环。 - 逻辑解耦:将SQL存储过程执行逻辑封装为独立函数,便于根据实际数据库类型(SQL Server、MySQL等)适配具体实现。
额外优化建议
- 添加文件完整性校验:比如判断文件大小在一段时间内不再变化,避免导入正在写入的不完整文件。
- 增加异常处理:捕获目录不存在、数据库连接失败等异常,提升程序稳定性。
内容的提问来源于stack exchange,提问作者SS25
相关产品推荐
相关产品推荐

