89 lines
3.1 KiB
Python
89 lines
3.1 KiB
Python
# scanner.py
|
|
# Funções para ler diretórios e listar ficheiros
|
|
from pathlib import Path
|
|
from tqdm import tqdm
|
|
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.")
|
|
# se for passado filtro de extensoes, processar lista de extensoes para
|
|
# que cada extensão tenha o formato '.xxx'
|
|
if extensoes:
|
|
extensoes = [
|
|
ext.lower() if ext.startswith(".") else f".{ext.lower()}"
|
|
for ext in extensoes
|
|
]
|
|
# criar lista de ficheiros
|
|
ficheiros = []
|
|
for item in tqdm(
|
|
caminho_origem.rglob("*"), desc="A listar ficheiros", unit="ficheiro"
|
|
):
|
|
if item.is_file():
|
|
# filtro de ficheiros ocultos
|
|
if not incluir_ocultos and item.name.startswith("."):
|
|
continue
|
|
# filtro de extensoes
|
|
if extensoes and item.suffix.lower() not in extensoes:
|
|
continue
|
|
ficheiros.append(str(item))
|
|
|
|
return 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.")
|
|
# se for passado filtro de extensoes, processar lista de extensoes para
|
|
# que cada extensão tenha o formato '.xxx'
|
|
if extensoes:
|
|
extensoes = [
|
|
ext.lower() if ext.startswith(".") else f".{ext.lower()}"
|
|
for ext in extensoes
|
|
]
|
|
|
|
# dicionario de ficheiros com assinatura
|
|
ficheiros_por_assinatura: dict[str, list[str]] = {}
|
|
|
|
for item in tqdm(
|
|
caminho_origem.rglob("*"), desc="A listar ficheiros únicos", unit="ficheiro"
|
|
):
|
|
if item.is_file():
|
|
# filtro ficheiros ocultos
|
|
if not incluir_ocultos and item.name.startswith("."):
|
|
continue
|
|
# filtro extenseos
|
|
if extensoes and item.suffix.lower() not in extensoes:
|
|
continue
|
|
assinatura = gerar_assinatura_SHA256_ficheiro(str(item))
|
|
ficheiros_por_assinatura.setdefault(
|
|
assinatura, []).append(str(item))
|
|
|
|
return ficheiros_por_assinatura
|