Utilizamos atualmente as funções de compactação/descompactação do próprio Harbour para salvar diversos arquivos, e nunca tivemos problema.
Porém, em alguns clientes com muitos arquivos (mais de 400 mil), principalmente XMLs de documentos fiscais, o processo tem se tornado muito lento.
Pesquisando algoritmos ou bibliotecas mais modernas e eficientes, encontramos o Zstd ( Zstandard ), criado pelo Facebook e utilizado por diversas
grandes empresas que trabalham com quantidades enormes de dados. Analisando os benchmarks e casos de uso, parece ser bastante eficiente, ficando
entre os mais rápidos e mantendo boas taxas de compressão. No site https://facebook.github.io/zstd/#other-languages existem exemplos e
wrapers para diversas linguagens, incluindo C, Delphi, VB6, porém, estou com dificuldade em aproveitá-los para que possa utilizar no Harbour.
Tentei o seguinte:
Incluà os cabeçalhos zstd.h e stddef.h, carreguei a dll com HB_LibLoad e chequei o valtype, que retornou "P", ou seja, ela foi carregada corretamente.
Tentei chamar a função ZSTD_Compress com HB_Dyncall, conforme abaixo, mas acusa erro de GPF:
hDll := HB_LibLoad(Application:cDirectory+"libzstd.dll")
hb_dynCall( { "ZSTD_compress", hDll, HB_DYN_CALLCONV_STDCALL }, Application:cDirectory+"teste.txt" )
Acredito que falte passar algum parâmetro para a função, mas não consegui identificar como fazer.
Se alguém puder ajudar a traduzir um dos exemplos para o Harbour, ou ao menos indicar o que falta ou o que está errado, ficarei muito grato.
Obrigado,