Faça uso dos pacotes Archiver e Unzipper para compactar e descompactar arquivos no Node.js.

O arquivamento de arquivos é uma atividade cotidiana no mundo moderno, pois todos podem atestar as vantagens oferecidas pela compactação de arquivos ou pastas em formatos menores e portáteis.

O formato ZIP é um dos formatos de arquivo mais populares usados ​​no mundo da computação e é altamente recomendado escolha para qualquer pessoa que precise converter arquivos brutos em arquivos para melhor armazenamento, transferência eficiente ou qualquer outro razão.

Então, por que você deveria considerar compactar seus arquivos e como você pode compactar arquivos para ZIP e extraí-los de volta ao seu estado original programaticamente usando Node.js?

Por que compactar arquivos?

Muitas vezes, arquivos e pastas ficam muito grandes, e compartilhá-los ou transferi-los torna-se um problema porque são são muito grandes para armazenar em uma unidade de armazenamento de uma capacidade específica ou estão demorando muito para carregar na nuvem armazenar.

Em cenários como este e muitos outros, você deve compactar esses arquivos ou pastas em um tamanho muito menor. Além de facilitar a transferência de arquivos, outros motivos pelos quais você pode considerar compactar seus arquivos incluem:

  • Armazenamento eficiente
  • Melhor estrutura e organização de arquivos
  • Segurança (criptografia de arquivos e proteção por senha)
  • Integridade do arquivo
  • Controle de versão de arquivo

O que são os pacotes Node.js Archiver e Unzipper?

O arquivo a documentação oficial do pacote descreve o pacote como "uma interface de streaming para geração de arquivos". Isso implica que o pacote Archiver fornece uma biblioteca de funções que aproveitam os fluxos Node.js para criar arquivos compactados.

O pacote Archiver oferece suporte a vários formatos de arquivo por padrão, incluindo ZIP, GZIP e TAR. O pacote também permite criar arquivos de arquivos e diretórios e dividir grandes arquivos em partes menores (arquivos de vários volumes). Também permite excluir ou filtrar arquivos durante a compactação.

O Descompactar package é um pacote muito eficiente para extrair arquivos ZIP em Node.js. O pacote fornece uma API fácil de usar que permite aos desenvolvedores extrair arquivos ZIP com apenas algumas linhas de código.

Os pacotes Archiver e Unzipper são as escolhas para este tutorial porque se integram perfeitamente com o Node.js fs módulo, garantindo compatibilidade suave e simplicidade.

Como compactar arquivos para o formato ZIP no Node.js

Compactando arquivos para o formato ZIP em Node.js é fácil como em qualquer outra linguagem, graças ao pacote Archiver. Para criar arquivos ZIP em Node.js enquanto acompanha esta seção, você precisa de um ambiente de desenvolvimento Node.js configurado em seu computador.

Você criará um script Node.js simples para compactar um arquivo e uma pasta no formato ZIP. Crie um novo projeto Node em seu computador executando os seguintes comandos:

mkdir node-zip-archiver
cd node-zip-archiver
npm init -y

Em seguida, você precisa instalar o pacote Archiver em seu projeto. Correr npm install arquivador --save no seu terminal para instalá-lo. Quando a instalação do pacote estiver concluída, crie um novo arquivo no diretório do projeto e nomeie-o de acordo com sua preferência, por exemplo, app.js ou archiver.js.

O fs O módulo lida com operações de arquivo, enquanto o pacote Archiver lida com a compactação de arquivos e pastas em arquivos ZIP, portanto, o script requer ambos os módulos.

Criando arquivos ZIP a partir de arquivos

O código a seguir é a implementação de uma função que aceita um arquivo como argumento e cria uma versão ZIP compactada do arquivo.

const arquivador = exigir('arquivo')
const fs = exigir('fs')

// cria ZIP a partir do arquivo
const criarZipFromFile = (arquivo) => {
const caminho do arquivo = __dirname + '/' + arquivo
const saída = fs.createWriteStream (filePath + '.fecho eclair')
const arquivo = arquivador('fecho eclair', {
zlib: { nível: 9 } // define o nível de compressão para o mais alto
})

archive.pipe (saída);
archive.file (filePath, { nome: arquivo })
archive.finalize()
}

A função pega o nome do arquivo a ser compactado e gera um arquivo de saída com um nome semelhante (com a única diferença sendo a adição da extensão do arquivo ZIP).

Em seguida, a função gera um novo arquivo com o nível de compactação definido como 9 (mais alto) e utiliza o cano função para transferir os fluxos de saída do arquivo para a entrada do arquivo de saída.

O arquivo A função adiciona um arquivo ao arquivo. Ele aceita o caminho do arquivo como parâmetro e opcional opções parâmetro onde você pode especificar as propriedades do arquivo no arquivo.

O nome A opção designa o nome do arquivo dentro do arquivo. Se a opção não for especificada ao adicionar um arquivo ao arquivo, o Archiver coloca o arquivo dentro do arquivo com base em seu caminho original, preservando a estrutura do diretório.

No entanto, quando é fornecido explicitamente, o Archiver adiciona o arquivo ao arquivo sem seu caminho original, permitindo nomeação personalizada e organização dentro do arquivo.

Criando arquivos ZIP a partir de pastas

O processo de criação de arquivos ZIP a partir de pastas não é muito diferente daquele para arquivos. A principal diferença é o uso do pacote Archiver diretório funcionar em oposição a arquivo na função anterior.

Abaixo está a implementação de uma função para compactar uma pasta em um arquivo ZIP.

// cria ZIP a partir da pasta
const criarZipFromFolder = (pasta) => {
const folderPath = __dirname + '/' + pasta
const saída = fs.createWriteStream (folderPath + '.fecho eclair')

const arquivo = arquivador('fecho eclair', {
zlib: { nível: 9 } // define o nível de compressão para o mais alto
})

archive.pipe (saída)
archive.directory (folderPath, falso)
archive.finalize()
}

O diretório A função usa o caminho da pasta como primeiro argumento e um sinalizador como segundo argumento. O sinalizador determina o posicionamento da pasta dentro do arquivo.

Quando a bandeira é definida como falso, o arquivo resultante conterá apenas o conteúdo da pasta, excluindo a própria pasta. Mas se o sinalizador estiver definido como verdadeiro, o Archiver incluirá a própria pasta no arquivo gerado

Se você quiser evitar contaminar o local onde está extraindo seu arquivo com arquivos do arquivo compactado, pense em definir o bandeira opção para verdadeiro. No entanto, você pode configurá-lo para falso, se for mais adequado aos seus propósitos.

Como descompactar arquivos em Node.js

O processo de extração de arquivos ZIP no Node.js tem várias abordagens e várias bibliotecas estão disponíveis para uso, mas neste artigo, o pacote Unzipper é usado.

Execute o seguinte comando em seu terminal para instalar o pacote Unzipper em seu projeto.

npm instalar descompactador --salvar

Após instalar o pacote, importe-o para o seu código e implemente a função de extração ZIP mostrada no código abaixo:

const descompactador = exigir("descompactar")

//função para extrair arquivo ZIP
const extrairZip = assíncrono (arquivo) => {
const caminho do arquivo = __dirname + '/' + arquivo
const outputPath = __dirname + '/extraído'
aguardam fs.createReadStream (filePath)
.pipe (descompactador. Extrair({ caminho: caminho de saída }))
.promessa()
}

O extrairZip é uma função assíncrona que cria um fluxo de leitura para ler o conteúdo do arquivo ZIP e extrai o arquivo para o caminho de saída especificado (cria o extraído pasta se ela não existir).

No caso de descompactação ou extração, não há necessidade de definir diferentes funções para arquivos e pastas, pois um arquivo ZIP é um arquivo independente do conteúdo nele contido.

Abaixo está uma função que você pode adicionar ao aplicativo, para testar as funções que você criou até agora:

(assíncronofunção () {
const arquivo = 'teste.pdf'
const pasta = 'pasta_teste'
const zipFile = 'teste.pdf.zip'
createZipFromFile (arquivo)
console.registro('Arquivo ZIP criado com sucesso a partir do arquivo')
createZipFromFolder (pasta)
console.registro('Arquivo ZIP criado com sucesso a partir da pasta')
aguardam extractZip (zipFile)
console.registro('Arquivo ZIP extraído com sucesso')
}) ()

Todas as funções anteriores são Funções de seta do JavaScript, mas a função acima é diferente porque é um Expressão de função invocada imediatamente que encapsula o código dentro dele e o executa imediatamente.

A compactação de arquivos é benéfica na criação de aplicativos eficientes

Deve ser sempre uma meta tornar seus aplicativos o mais eficientes possível para atender melhor os usuários e manter uma experiência de usuário agradável.

Em cenários em que você precisa transferir muitos arquivos em seu aplicativo, considere compactar e descompactar os arquivos durante a transmissão. A maioria das linguagens de programação modernas oferece suporte para compactar e descompactar arquivos com eficiência.