From 70800904b69b5dbe8cbc7bf71c3695b5405ed3b6 Mon Sep 17 00:00:00 2001 From: Luis Rodrigues Date: Sat, 26 Apr 2025 21:59:48 +0100 Subject: [PATCH] =?UTF-8?q?implementar=20fun=C3=A7=C3=A3o=20'listar=5Ffich?= =?UTF-8?q?eiros=5Funicos()'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/scanner.py | 56 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 7 deletions(-) diff --git a/modules/scanner.py b/modules/scanner.py index 5ca3f2a..7e86203 100644 --- a/modules/scanner.py +++ b/modules/scanner.py @@ -2,29 +2,71 @@ # 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 + 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.") - ficheiros = [str(item) - for item in caminho_origem.rglob("*") if item.is_file()] + # 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 Path(f).name.startswith(".")] + 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 Path( - f).suffix.lower() in extensoes] - return ficheiros + 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