implementar função 'listar_ficheiros_unicos()'

This commit is contained in:
2025-04-26 21:59:48 +01:00
parent 446cd24c74
commit 70800904b6

View File

@ -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