Domanda

Sto usando ionico.zip (versione quadro compatta) nel mio progetto Pocket-PC.
Estrarre file zippati (usando ionico.zip) stanno funzionando correttamente.Se inserisco la password sul file compresso, richiede la password prima di estrarre, ma quando provo questa istanza, la convalida della password per l'estrazione fallisce.

Esempio: questa cartella sta per comprimere.

\MyDevice\My Documents\My Pictures  
.

Questa cartella contiene due file ('Flower.jpg','Waterfall.jpg')
Comprimere il file usando questo codice:

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;
    }
}
.

Codice di Estrazione:

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;
    }
}  
.

Estrazione del file in questa posizione funziona alla grande, perché richiede la password:

\MyDevice\My Documents\Personal  
.

Ma!Quando estrai il file sulla stessa cartella:

\MyDevice\My Documents\My Pictures  
.

Estrai i file senza richiedere la password.
Penso che questo sia un bug.Cosa posso fare per questo?
Spero che qualcuno potesse rispondere.Grazie!

È stato utile?

Soluzione

C'è un bug nel tuo metodo Compress ().Quando si comprimono i file, la proprietà della password dell'istanza della Zipfile non è mai impostata.Dai un'occhiata alla tua logica che decide se assegnare o meno la proprietà Zip.Password.

Legge:

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

Come scritto, la proprietà Zip.Password verrà impostata solo se il parametro password è null o una stringa vuota.Se il parametro password è una stringa non vuota, il codice salta la dichiarazione di assegnazione di assegnazione zip.password.

L'istruzione IF nel metodo Compress () manca un operatore non .Dovrebbe leggere:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top