Question

j'utilise Ionic.zip (Version Framework compacte) Dans mon projet Pocket-PC.
L'extraction de fichiers zippés (utilisant ionic.zip) fonctionne correctement. Si je mets un mot de passe sur le fichier compressé, il nécessite le mot de passe avant d'extraire, mais lorsque j'essaie cette instance, la validation du mot de passe pour l'extraction échoue.

Exemple: ce dossier est sur le point de compresser.

\MyDevice\My Documents\My Pictures  

Ce dossier contient deux fichiers ('Flower.jpg','Waterfall.jpg')
Compression du fichier à l'aide de ce code:

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

Code d'extraction:

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

L'extraction du fichier à cet emplacement fonctionne très bien, car elle nécessite un mot de passe:

\MyDevice\My Documents\Personal  

Mais! Lorsque j'extrait le fichier sur le même dossier:

\MyDevice\My Documents\My Pictures  

Il extrait les fichiers sans nécessiter le mot de passe.
Je pense que c'est un bug. Que puis-je faire pour ça?
J'espère que quelqu'un pourrait répondre. Merci!

Était-ce utile?

La solution

Il y a un bug dans votre méthode compress (). Lors de la compression de vos fichiers, la propriété du mot de passe de l'instance ZipFile n'est jamais définie. Jetez un œil à votre logique qui décide d'attribuer ou non la propriété zip.password.

Ça lit:

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

Comme écrit, la propriété Zip.Password ne sera définie que si le paramètre de mot de passe est nul ou une chaîne vide. Si le paramètre de mot de passe est une chaîne non impliquée, le code saute l'instruction Affectation Zip.Password.

La méthode IF-Statement dans votre méthode compress () manque un ne pas opérateur. Il devrait lire:

if ( ! string.IsNullOrEmpty(Password))
    zip.Password = Password
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top