implementar função 'listar_ficheiros_unicos()'
This commit is contained in:
@ -2,29 +2,71 @@
|
|||||||
# Funções para ler diretórios e listar ficheiros
|
# Funções para ler diretórios e listar ficheiros
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
from modules.utils import gerar_assinatura_SHA256_ficheiro
|
||||||
|
|
||||||
|
|
||||||
def listar_ficheiros(
|
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:
|
) -> list:
|
||||||
"""
|
"""
|
||||||
Percorrer recursivamente a pasta de origem e devolver lista de caminhos completos dos ficheiros.
|
Percorrer recursivamente a pasta de origem e devolver lista de caminhos completos dos ficheiros.
|
||||||
versão Pathlib
|
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)
|
caminho_origem = Path(origem)
|
||||||
if not caminho_origem.exists():
|
if not caminho_origem.exists():
|
||||||
raise FileNotFoundError(f"Erro: a pasta '{origem}' não existe.")
|
raise FileNotFoundError(f"Erro: a pasta '{origem}' não existe.")
|
||||||
if not caminho_origem.is_dir():
|
if not caminho_origem.is_dir():
|
||||||
raise NotADirectoryError(
|
raise NotADirectoryError(
|
||||||
f"Erro: o caminho '{origem}' não é um directório.")
|
f"Erro: o caminho '{origem}' não é um directório.")
|
||||||
ficheiros = [str(item)
|
# criar lista de ficheiros
|
||||||
for item in caminho_origem.rglob("*") if item.is_file()]
|
ficheiros = [item for item in caminho_origem.rglob("*") if item.is_file()]
|
||||||
|
# filtro de ocultos
|
||||||
if not incluir_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:
|
if extensoes:
|
||||||
extensoes = [
|
extensoes = [
|
||||||
ext.lower() if ext.startswith(".") else f".{ext.lower()}"
|
ext.lower() if ext.startswith(".") else f".{ext.lower()}"
|
||||||
for ext in extensoes
|
for ext in extensoes
|
||||||
]
|
]
|
||||||
ficheiros = [f for f in ficheiros if Path(
|
ficheiros = [f for f in ficheiros if f.suffix.lower() in extensoes]
|
||||||
f).suffix.lower() in extensoes]
|
# criar dicionario com assinaturas de ficheiros listados
|
||||||
return ficheiros
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user