wav_cleaner.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. WAV 文件夹自动清理监控器
  5. 实时监控 /mnt/nvme1data/Digital_Human/Image_Analysis/wav/wav 目录
  6. 当 WAV 文件数量超过 20 条时,自动删除最旧的文件
  7. """
  8. import os
  9. import time
  10. import logging
  11. from pathlib import Path
  12. from datetime import datetime
  13. # 配置日志
  14. logging.basicConfig(
  15. level=logging.INFO,
  16. format='%(asctime)s - %(levelname)s - %(message)s',
  17. handlers=[
  18. logging.FileHandler('/mnt/nvme1data/Digital_Human/Image_Analysis/wav_cleaner.log'),
  19. logging.StreamHandler()
  20. ]
  21. )
  22. logger = logging.getLogger(__name__)
  23. class WavFolderMonitor:
  24. """WAV 文件夹监控器"""
  25. def __init__(self, watch_dir, max_files=20, check_interval=5):
  26. """
  27. 初始化监控器
  28. Args:
  29. watch_dir: 监听的目录路径
  30. max_files: 最大文件数量(默认20)
  31. check_interval: 检查间隔(秒,默认5秒)
  32. """
  33. self.watch_dir = Path(watch_dir)
  34. self.max_files = max_files
  35. self.check_interval = check_interval
  36. # 确保目录存在
  37. self.watch_dir.mkdir(parents=True, exist_ok=True)
  38. logger.info(f"🎯 WAV 文件夹监控器已初始化")
  39. logger.info(f" 监听目录: {self.watch_dir}")
  40. logger.info(f" 最大文件数: {self.max_files}")
  41. logger.info(f" 检查间隔: {self.check_interval}秒")
  42. def get_wav_files(self):
  43. """获取所有 WAV 文件,按修改时间排序"""
  44. wav_files = list(self.watch_dir.glob('*.wav'))
  45. # 按修改时间排序(最新的在后)
  46. wav_files.sort(key=lambda p: p.stat().st_mtime)
  47. return wav_files
  48. def cleanup_old_files(self):
  49. """清理超过限制的最旧文件"""
  50. try:
  51. wav_files = self.get_wav_files()
  52. file_count = len(wav_files)
  53. if file_count > self.max_files:
  54. # 需要删除的文件数量
  55. delete_count = file_count - self.max_files
  56. logger.warning(f"⚠️ 文件数量 ({file_count}) 超过限制 ({self.max_files})")
  57. logger.warning(f" 准备删除最旧的 {delete_count} 个文件...")
  58. # 删除最旧的文件
  59. for i in range(delete_count):
  60. old_file = wav_files[i]
  61. try:
  62. file_size = old_file.stat().st_size
  63. file_age = time.time() - old_file.stat().st_mtime
  64. logger.info(f" 🗑️ 删除: {old_file.name}")
  65. logger.info(f" 大小: {file_size / 1024:.2f} KB")
  66. logger.info(f" 年龄: {file_age / 60:.1f} 分钟")
  67. old_file.unlink()
  68. except Exception as e:
  69. logger.error(f" ❌ 删除失败 {old_file.name}: {e}")
  70. logger.info(f"✅ 清理完成,剩余文件: {self.max_files}")
  71. return delete_count
  72. else:
  73. logger.debug(f"✓ 文件数量正常: {file_count}/{self.max_files}")
  74. return 0
  75. except Exception as e:
  76. logger.error(f"❌ 清理文件时出错: {e}")
  77. return 0
  78. def monitor(self):
  79. """开始监控循环"""
  80. logger.info("🚀 开始监控 WAV 文件夹...")
  81. logger.info("按 Ctrl+C 停止监控")
  82. check_count = 0
  83. try:
  84. while True:
  85. check_count += 1
  86. logger.debug(f"--- 第 {check_count} 次检查 ---")
  87. # 执行清理
  88. deleted = self.cleanup_old_files()
  89. # 每次清理后显示当前状态
  90. current_files = self.get_wav_files()
  91. if current_files:
  92. newest = current_files[-1]
  93. newest_age = (time.time() - newest.stat().st_mtime) / 60
  94. logger.info(f"📊 当前状态: {len(current_files)} 个文件 | 最新: {newest.name} ({newest_age:.1f}分钟前)")
  95. else:
  96. logger.info("📊 当前状态: 0 个文件")
  97. # 等待下一次检查
  98. time.sleep(self.check_interval)
  99. except KeyboardInterrupt:
  100. logger.info("\n🛑 收到停止信号,监控已停止")
  101. except Exception as e:
  102. logger.error(f"❌ 监控过程中出错: {e}")
  103. raise
  104. def main():
  105. """主函数"""
  106. # 配置路径
  107. watch_dir = '/mnt/nvme1data/Digital_Human/Image_Analysis/wav/wav'
  108. max_files = 20
  109. check_interval = 3600 # 每小时检查一次
  110. # 创建监控器
  111. monitor = WavFolderMonitor(
  112. watch_dir=watch_dir,
  113. max_files=max_files,
  114. check_interval=check_interval
  115. )
  116. # 启动监控
  117. monitor.monitor()
  118. if __name__ == "__main__":
  119. main()