Files
test-loderweb/services/file_finder.py
2026-01-22 18:32:18 +05:00

98 lines
4.2 KiB
Python

"""
Модуль для поиска файлов формата .xlsx в директории
"""
import logging
from pathlib import Path
class FileFinderService:
"""Сервис для поиска и управления файлами .xlsx"""
def __init__(self):
"""Инициализирует сервис поиска файлов."""
self.xlsx_files = []
logging.info("FileFinderService инициализирован.")
def find_xlsx_files(self, directory_path, recursive=True):
"""
Ищет все файлы формата .xlsx в директории и сортирует их.
Args:
directory_path (str или Path): Путь к директории для поиска
recursive (bool): Искать ли рекурсивно по подпапкам
Returns:
list: Список путей до файлов .xlsx в порядке возрастания
"""
try:
dir_path = Path(directory_path)
if not dir_path.exists():
logging.error(f"❌ Директория не найдена: {directory_path}")
return []
if not dir_path.is_dir():
logging.error(f"❌ Это не директория: {directory_path}")
return []
logging.info(f"🔍 Начинаю поиск .xlsx файлов в: {dir_path}")
# Ищем все файлы .xlsx
if recursive:
xlsx_files = list(dir_path.glob('**/*.xlsx'))
logging.info(" (поиск во всех подпапках)")
else:
xlsx_files = list(dir_path.glob('*.xlsx'))
logging.info(" (только текущая папка)")
# Сортируем в порядке возрастания по имени файла
xlsx_files.sort(key=lambda x: x.name)
# Сохраняем результаты
self.xlsx_files = xlsx_files
logging.info(f"✅ Найдено файлов .xlsx: {len(xlsx_files)}")
# Логируем каждый найденный файл
if xlsx_files:
for idx, file_path in enumerate(xlsx_files, 1):
logging.info(f" [{idx}] {file_path.name}")
else:
logging.warning("⚠️ Файлы .xlsx не найдены в указанной директории")
return xlsx_files
except Exception as e:
logging.error(f"❌ Ошибка при поиске .xlsx файлов: {e}")
return []
def get_file_paths(self):
"""Возвращает список сохраненных путей файлов."""
return self.xlsx_files
def get_file_paths_as_strings(self):
"""Возвращает список путей в виде строк."""
return [str(file_path) for file_path in self.xlsx_files]
def get_file_count(self):
"""Возвращает количество найденных файлов."""
return len(self.xlsx_files)
def get_file_by_index(self, index):
"""Возвращает файл по индексу (0-based)."""
try:
if 0 <= index < len(self.xlsx_files):
file_path = self.xlsx_files[index]
logging.info(f"📄 Получен файл #{index + 1}: {file_path.name}")
return file_path
else:
logging.warning(f"⚠️ Индекс {index} выходит за границы (всего: {len(self.xlsx_files)})")
return None
except Exception as e:
logging.error(f"❌ Ошибка при получении файла по индексу: {e}")
return None
def clear(self):
"""Очищает список найденных файлов."""
self.xlsx_files = []
logging.info("🗑️ Список файлов очищен.")