Ionic.Zip extrai arquivos e ignora a senha
-
12-11-2019 - |
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!
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