C#

28 jun, 2018

Utilizando o C# e o 7zip para compactar e descompactar arquivos com ou sem senha em sua aplicação

Publicidade

Introdução

No artigo de hoje vou mostrar como fazer o 7zip se tornar seu “amigo” na hora de criptografar e descriptografar arquivos com ou sem senhas dentro de uma aplicação .NET, de maneira bastante rápida e descomplicada.

Aplicação

Primeiramente vamos criar uma aplicação Console Application (File > New > Project), conforme na figura 1, abaixo:

Figura 1

Feito isso, vamos criar três pastas no nosso projeto com os nomes 7zip (que vai conter o executável do 7zip), ToZip (que vai conter os arquivos a serem compactados) e ToUnzip (com os arquivos a serem descompactados), conforme a figura abaixo:

Figura 2

Agora chega de configuração e vamos para a melhor parte do artigo: show me the code! (Código comentado para melhor entendimento).

class Program
    {
        private static void ZipFile(string file, string outPath)
        {
            //Classe utilizada para se iniciar um processo no windows.
            ProcessStartInfo process = new ProcessStartInfo();
            //Define qual aplicação será executado.
            process.FileName = Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, @"..\..\..\7zip\7z.exe"));
            //Define os argumentos que serão utilizados pela aplicação definida no FileName, no caso abaixo o "a" define que será uma compactação e o "-p" a senha que será necessária para descompactar futuramente.
            process.Arguments = quot;a \"{Path.GetFileNameWithoutExtension(file)}\" \"{file}\" \"-piMasters\"";
            //Define o diretório de trabalho.
            process.WorkingDirectory = outPath;
            //Define se o shell do sistema deve ser executado.
            process.UseShellExecute = false;
            //Define se o processo deve ser executado em uma nova janela.
            process.CreateNoWindow = true;
            //Inicia-se o processo.
            var zipFile = Process.Start(process);
            //Aguarda o encerramento do processo iniciado.
            zipFile.WaitForExit();
            //Apaga o arquivo que acabou de ser zipado.
            File.Delete(file);
        }

        private static void UnzipFile(string file, string outPath)
        {
            //Classe utilizada para se iniciar um processo no windows.
            ProcessStartInfo process = new ProcessStartInfo();
            //Define qual aplicação será executado.
            process.FileName = Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, @"..\..\..\7zip\7z.exe"));
            //Define os argumentos que serão utilizados pela aplicação definida no FileName, no caso abaixo o "x" define que será uma descompactação e o "-p" a senha para que isso seja possível".
            process.Arguments = quot;x \"{file}\" \"-piMasters\"";
            //Define o diretório de trabalho.
            process.WorkingDirectory = outPath;
            // Define se o shell do sistema deve ser executado.
            process.UseShellExecute = false;
            //Define se o processo deve ser executado em uma nova janela.
            process.CreateNoWindow = true;
            //Inicia-se o processo.
            var unzipFile = Process.Start(process);
            //Aguarda o encerramento do processo iniciado.
            unzipFile.WaitForExit();
            //Apaga o arquivo que acabou de ser zipado.
            File.Delete(file);
        }

        static void Main(string[] args)
        {
            //Localiza-se a pasta para descompactar os arquivos .7z.
            var pathToUnzip = Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, @"..\..\..\ToUnzip"));

            //Localiza-se a pasta para compactar seus arquivos.
            var pathToZip = Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, @"..\..\..\ToZip"));
            
            //Array com todos os arquivos que seram compactados.
            var fileNameToZip = Directory.GetFiles(pathToZip);
            foreach (var file in fileNameToZip)
            {
                ZipFile(file, pathToUnzip);
            }

            //Array com todos os arquivos que seram descompactados.
            var fileNameToUnzip = Directory.GetFiles(pathToUnzip);
            foreach (var file in fileNameToUnzip)
            {
                UnzipFile(file, pathToZip);
            }
        }
    }

Agora vamos para o último passo da nossa aplicação, que é colocar o executável do 7zip na nossa aplicação.

7zip

Primeiramente, caso você não tenha o 7zip instalado. baixe-o através do link https://www.7-zip.org/download.html e após finalizar a instalação, abra a pasta onde ele foi instalado (provavelmente em C:\Program Files\7-Zip) e em seguida copie o arquivo 7z.exe e cole dentro da pasta 7zip do nosso projeto.

Feito isso, vamos rodar o projeto e você poderá observar que todos os arquivos que você colocar na pasta ToZip serão compactados, e em seguida, jogados para a pasta ToUnzip, que por sua vez serão descompactados e jogados novamente na pasta ToZip.

Caso queiram baixar a aplicação, ela estará disponível no meu GitHub através do link:

Espero que tenham gostado do artigo e até a próxima!

Obrigado.