# scanner.py # Funções para ler diretórios e listar ficheiros from pathlib import Path from modules.utils import gerar_assinatura_SHA256_ficheiro def listar_ficheiros( origem: str = ".", incluir_ocultos: bool = True, extensoes: list[str] | None = None, ) -> list: """ Percorrer recursivamente a pasta de origem e devolver lista de caminhos completos dos ficheiros. versão Pathlib """ sha256_ficheiros: dict[str, str] = {} caminho_origem = Path(origem) if not caminho_origem.exists(): raise FileNotFoundError(f"Erro: a pasta '{origem}' não existe.") if not caminho_origem.is_dir(): raise NotADirectoryError( f"Erro: o caminho '{origem}' não é um directório.") # criar lista de ficheiros ficheiros = [item for item in caminho_origem.rglob("*") if item.is_file()] # filtro de ocultos if not incluir_ocultos: ficheiros = [f for f in ficheiros if not f.name.startswith(".")] # filtro de extensoes if extensoes: extensoes = [ ext.lower() if ext.startswith(".") else f".{ext.lower()}" for ext in extensoes ] ficheiros = [f for f in ficheiros if f.suffix.lower() in extensoes] return [str(f) for f in ficheiros] def listar_ficheiros_unicos( origem: str = ".", incluir_ocultos: bool = True, extensoes: list[str] | None = None, ) -> dict[str, list[str]]: """ Listar ficheiros unicos na pasta origem, agrupando caminhos por assinatura SHA256. Retorna dicionario: { assinatura: [caminho1, caminho2, ...] } """ caminho_origem = Path(origem) if not caminho_origem.exists(): raise FileNotFoundError(f"Erro: a pasta '{origem}' não existe.") if not caminho_origem.is_dir(): raise NotADirectoryError( f"Erro: o caminho '{origem}' não é um directório.") # criar lista de ficheiros ficheiros = [item for item in caminho_origem.rglob("*") if item.is_file()] # filtro de ocultos if not incluir_ocultos: ficheiros = [f for f in ficheiros if not f.name.startswith(".")] # filtro de extensoes if extensoes: extensoes = [ ext.lower() if ext.startswith(".") else f".{ext.lower()}" for ext in extensoes ] ficheiros = [f for f in ficheiros if f.suffix.lower() in extensoes] # criar dicionario com assinaturas de ficheiros listados assinatura_para_caminhos = {} for ficheiro in ficheiros: assinatura = gerar_assinatura_SHA256_ficheiro(str(ficheiro)) assinatura_para_caminhos.setdefault( assinatura, []).append(str(ficheiro)) return assinatura_para_caminhos