Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Alguma atualização sobre isso? Estou encontrando erros em
Jacobie, Stanislav Korotky publicou um pacote que contém essa biblioteca zip aqui, com algumas correções.
Eu o testei e, até agora, está funcionando muito bem.
Deparei-me com um arquivo que o CZip não conseguiu descompactar. Ao mesmo tempo, o 7ZIP e o Windows Archiver descompactaram sem problemas.
Imprimi o tamanho dos dados compactados, que acabou sendo dezenas de megabytes menor do que o arquivo (e há apenas um arquivo nele).
CompressedSize:76964920Comecei a procurar onde ele é calculado e o encontrei na função FindZipFileSize().Experimentei...
Descobri que, se você retornar todos os dados end_size como tamanho dos dados, o arquivo será descompactado corretamente. Aparentemente, ao descompactar, o próprio código determina o fim dos dados, em vez de confiar na resposta dessa função. O principal é que ele não deve ser menor. Você poderia deixá-lo assim, mas acontece que a função é inútil, o que é improvável. E talvez alguns outros arquivos falhem...
Mais um experimento mostrou que, se você comentar as linhas
O arquivo também começa a ser descompactado. A quantidade de dados está próxima de 100%.
CompressedSize:106638447Acontece que o arquivo tem uint cdheader = 0x504b0102; e isso é uma parte dos dados compactados, não um rótulo de seu final.Você cometeu um erro com o rótulo? Encontrei esse rótulo em uma pesquisa na Internet. Talvez ele deva ser processado de alguma outra forma, em vez de cortar os dados por ele, eu cortei 30 MB.
Posso enviar o arquivo para você em uma mensagem privada se estiver interessado em descobrir isso.Função trabalhando com este arquivo: (arquivo \Include\Zip\Zip\Zip.mqh)
Outro erro com outro arquivo. Desta vez, comentar as linhas ajudou
Ou seja, o código uint header = 0x504b0304; também ocorre no conteúdo do arquivo e ele é descompactado com êxito pelo 7Zip, pelo Windows e por essa versão corrigida do CZip.
Como as duas saídas do loop estão desativadas, o loop se tornou supérfluo, pode ser excluído e retornado:
Obviamente, há algum defeito nessa função. Afinal de contas, a condição
nunca será cumprida, pois ao sair do loop quando o fim dos dados for atingido, size == end_size será size == end_size, e não 1 a menos.
Como resultado, reduzi a função para uma linha:
O programa com essa versão da função já baixou 110 arquivos de 12 Gg no total e descompactou tudo com sucesso.
Se alguém tiver problemas com a descompactação, pode tentar essa versão da função.
O arquivo deveria ter 1,8 bilhão de elementos char, mas foi descompactado e cortado para 1,5 bilhão. Alguns dados foram perdidos. É estranho que ele tenha sido cortado tão curto, pois as matrizes podem ter até 2147483647 elementos.
A função de terminal
produz dados cortados.
Não há nada a ser feito sobre isso...
Pensei que fosse possível decodificar em blocos pares de kb/mb - forneci 1024, 1024*1024 e 1024*1024*10 - mas não funcionou.
Existe alguma maneira de usar o arquivador do Windows? Usar o WinExec para descompactar em um arquivo e depois lê-lo linha por linha. Dessa forma, a automação permanecerá. Mas não para o mercado.Terei que salvar os arquivos, descompactá-los manualmente e depois processá-los. Isso será incômodo - sem automação ((
Existe alguma maneira de usar o arquivador do Windows? Use o WinExec para descompactar em um arquivo e, em seguida, leia-o linha por linha.
Você pode, obviamente. Qual é o problema? Talvez eu tenha entendido errado? Há muito tempo existem os arquivadores de console UnRAR.exe, UnZip.exe, etc.
Outro erro com outro arquivo. Desta vez, comentar as linhas ajudou
Ou seja, o código uint header = 0x504b0304; também ocorre no conteúdo do arquivo e ele é descompactado com sucesso pelo 7Zip, pelo Windows e por essa versão corrigida do CZip.
Como as duas saídas do loop estão desativadas, o loop se tornou supérfluo, pode ser excluído e retornado:
Obviamente, há algum defeito nessa função. Afinal de contas, a condição
nunca será cumprida, pois ao sair do loop quando o fim dos dados for atingido, o tamanho == tamanho_final será tamanho == tamanho_final, não 1 a menos.
Como resultado, reduzi a função para uma linha:
O programa com essa versão da função já baixou 110 arquivos de 12 Gg no total e descompactou tudo com êxito.
Se alguém tiver problemas com a descompactação, pode tentar essa versão da função.
Posso supor que você ainda precise procurar rótulos, mas não no corpo do arquivo, e sim entre os arquivos, se houver vários deles. Provavelmente, os comprimentos dos arquivos devem ser registrados em algum lugar....
Em geral, minha solução é particular para minha tarefa com 1 arquivo no arquivo, se houver vários deles - talvez você precise fazer outra coisa.
Posso presumir que os rótulos ainda precisam ser pesquisados, mas não no corpo do arquivo, e sim entre os arquivos, se houver vários deles. Provavelmente, os comprimentos do arquivo devem ser registrados em algum lugar....
Em geral, minha solução é particular para minha tarefa com 1 arquivo no arquivo, se houver vários deles - talvez seja necessário fazer outra coisa.
Fiz uma impressão dos tamanhos compactados e descompactados que deveriam estar nos cabeçalhos.
Os arquivos que baixei têm 0 0. Se o tamanho for 0, o FindZipFileSize() discutido acima será chamado.
Criei um arquivo com o primeiro arquivo usando um arquivador normal. Os tamanhos no cabeçalho:
46389587 376516461
E outro arquivo com mais dois arquivos, incluindo o que foi adicionado ao primeiro arquivo:
46981880 314725045
46389587 376516461
Ambos têm os tamanhos escritos nos cabeçalhos e não chamaram FindZipFileSize()
E os arquivos que baixei (com tamanhos 0 0) aparentemente foram criados por um software que não escreveu os tamanhos nos cabeçalhos.Talvez minha solução para encurtar o FindZipFileSize() seja universal.
Nós podemos, obviamente. Qual é o problema? Talvez eu tenha entendido errado? Há muito tempo existem os arquivadores de console UnRAR.exe, UnZip.exe, etc.
Fiz a descompactação por meio do 7-zip (o UnZip.exe não é atualizado desde 2009, nem mesmo o suporte ao Win 7 está escrito).
Comparei a velocidade:
Esta biblioteca CZIP:
2025.06.14 20:59:06.758 Arquivo aberto com sucesso. Total de arquivos: 1.
2025.06.14 20:59:07.345 UnZipped
587ms
7-zip:
2025.06.14 21:00:07.312 Iniciar descompactação pelo 7-Zip.
2025.06.14 21:00:09.274 Descompactado pelo 7-Zip. Tamanho do arquivo: 428,22 MB
1962 ms
Isso é apenas para descompactar o arquivo com redefinição para o disco SSD. Você também precisa ler o arquivo do disco linha por linha.
Tempo total do início ao fim da análise:
Tempo total: 10s 709ms
e
Tempo total: 12s 892ms
A diferença é de 2s 183 ms.
Em geral, é preferível usar essa biblioteca CZIP para obter velocidade e, se o arquivo for muito grande, usar outros arquivadores.
Para mim, para ~1000 arquivos a 2 segundos cada = 33 minutos de economia. Na verdade, mais, já que este é um exemplo com o menor arquivo de 428 mb, o CZIP descompacta arquivos de até 1,7 GB.
Qualquer arquivo maior (até 4 GB) é tratado pelo 7-zip. Portanto, há uma economia de 1 a 1,5 horas.
Testei o CZIP com minhas edições - descompactou mais de 600 arquivos em 100 GB sem erros.