WeldingSpotPerformance/src/controller/file_manager.py

105 lines
3.9 KiB
Python
Raw Normal View History

import os
from loguru import logger
from base.base import BaseDirectoryMonitor, BaseFileManager, Settings
class FileManager(BaseFileManager):
def replot_all(self) -> None:
if self._paths_library is not None:
self._mediator.notify(self, list(self._paths_library))
def open_custom_file(self, path:str) -> None:
self._paths_library.add(path)
self._mediator.notify(self, [path if path else ''])
def set_mode(self, num:int) -> None:
match num:
case 1: # Режим создания отчета
self._monitor.stop()
self._paths_library.clear()
self._paths_library.add('')
self._mediator.notify(self, list(self._paths_library))
case 2: # Режим онлайн-мониторинга папки
self._monitor.init_state()
self._monitor.start()
case 3: # Режим работы с трейсами клиента
self._monitor.stop()
self._paths_library.clear()
def update_monitor_settings(self, settings:Settings) -> None:
directory_path = settings.system['trace_storage_path'][0]
update_time = settings.system['monitor_update_period'][0]
if not os.path.exists(directory_path):
logger.warning(f"Путь {directory_path} не существует.")
#raise FileNotFoundError(f"Путь {directory_path} не существует.")
if update_time <= 0.01:
logger.warning(f"Интервал между проверками папки слишком мал: {update_time}")
if self._monitor.isActive: self._monitor.pause()
self._monitor._directory_path = directory_path
self._monitor._update_time = update_time
if self._monitor.isActive: self._monitor.start()
def add_new_paths(self, paths:list) -> None:
paths_set = set(paths)
new = self._paths_library.difference(paths_set)
self._paths_library.update(new)
self._mediator.notify(list(new))
def open_raw_traces_dir(self, path:str) -> None:
dat_file, txt_file = None, None
for entry in os.listdir(path):
full_path = os.path.join(path, entry)
if os.path.isfile(full_path):
_, ext = os.path.splitext(entry)
ext = ext.lower()
if ext == '.dat' and dat_file is None:
dat_file = full_path
elif ext == '.txt' and txt_file is None:
txt_file = full_path
if dat_file and txt_file:
break
if dat_file and txt_file:
self._mediator.prerender([dat_file, txt_file])
class DirectoryMonitor(BaseDirectoryMonitor):
def init_state(self):
if not os.path.exists(self._directory_path):
logger.error(f"Путь {self._directory_path} не существует.")
raise FileNotFoundError(f"Путь {self._directory_path} не существует.")
self._files = [
os.path.join(self._directory_path, file)
for file in os.listdir(self._directory_path)
if file.lower().endswith('.csv')
]
self.update_timer.timeout.connect(self._monitor)
logger.info("Monitor initiated!")
def _monitor(self):
current_files = [
os.path.join(self._directory_path, file)
for file in os.listdir(self._directory_path)
if file.lower().endswith('.csv')
]
new_files = sorted(list(filter(lambda x: x not in self._files, current_files)))
if new_files:
logger.info(f"New files detected: {new_files}")
self._file_manager.add_new_paths(new_files)
self._files = current_files
if not current_files:
self._files = []