Pergunta

estou usando Iônico.Zip (versão Compact Framework) no meu projeto Pocket-PC.
A extração de arquivos compactados (usando Ionic.Zip) está funcionando corretamente.Se eu colocar senha no arquivo compactado, ele exigirá a senha antes de extrair, mas quando tento esta instância, a validação da senha para extração falha.

Exemplo:Esta pasta está prestes a ser compactada.

\MyDevice\My Documents\My Pictures  

Esta pasta contém dois arquivos ('Flower.jpg','Waterfall.jpg')
Compactando o arquivo usando este código:

public string Compress(string[] Paths, string SaveFileName, string Password, string CompressionType)
{
    try
    {
        using (ZipFile zip = new ZipFile())
        {
            if (string.IsNullOrEmpty(Password))
                zip.Password = Password;
            zip.CompressionLevel = Utility.GetCompressionLevel(CompressionType);
            foreach (string item in Paths)
            {
                if (Utility.IsDirectory(item))
                    zip.AddDirectory(item);
                else if (Utility.IsFile(item))
                    zip.AddFile(item);
            }
            if (!SaveFileName.Trim().ToLower().EndsWith(".zip"))
                if (SaveFileName.Trim().EndsWith("."))
                    SaveFileName += "zip";
                else
                    SaveFileName += ".zip";

            zip.Save(SaveFileName);
        }
        return Utility.GetResourceString("ZipSuccess");
    }
    catch (Exception ex)
    {
        return ex.Message;
    }
}

Código de extração:

public string Decompress(string ZipFilePath, string TargetPath, string Password, bool OverwriteExistingFiles)
{
    try
    {
        using (ZipFile decompress = ZipFile.Read(ZipFilePath))
        {
            if (!string.IsNullOrEmpty(Password))
                decompress.Password = Password;

            foreach (ZipEntry e in decompress)
            {
                e.Extract(TargetPath, OverwriteExistingFiles ? ExtractExistingFileAction.OverwriteSilently : ExtractExistingFileAction.DoNotOverwrite);
            }
        }
        return Utility.GetResourceString("ExtractSuccess");
    }
    catch (Exception ex)
    {
        return ex.Message;
    }
}  

Extrair o arquivo neste local funciona muito bem, pois requer senha:

\MyDevice\My Documents\Personal  

Mas!Quando extraio o arquivo na mesma pasta:

\MyDevice\My Documents\My Pictures  

Ele extrai os arquivos sem exigir senha.
Eu penso que isto é um erro.O que posso fazer para isso?
Espero que alguém possa responder.Obrigado!

Foi útil?

Solução

Há um bug no seu método Compress().Ao compactar seus arquivos, a propriedade Password da instância ZipFile nunca é definida.Dê uma olhada na sua lógica que decide se deve ou não atribuir a propriedade zip.Password.

Lê-se:

if (string.IsNullOrEmpty(Password))
    zip.Password = Password;

Conforme escrito, a propriedade zip.Password será definida apenas se o parâmetro Password for nulo ou uma string vazia.Se o parâmetro Password for uma string não vazia, o código ignorará a instrução de atribuição zip.Password.

A instrução if em seu método Compress() está faltando um não operador.Deveria ler:

if ( ! string.IsNullOrEmpty(Password))
    zip.Password = Password
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top