2012-01-24 4 views
3

J'utilise Ionic.Zip (version Compact Framework) dans mon projet Pocket-PC.
L'extraction de fichiers compressés (à l'aide de Ionic.Zip) fonctionne correctement. Si je mets un mot de passe sur le fichier compressé, il faut le mot de passe avant d'extraire, mais quand j'essaye cette instance, la validation du mot de passe pour l'extraction échoue.Ionic.Zip extraire les fichiers et ignorer le mot de passe

Exemple: ce dossier est sur le point de se compresser.

\MyDevice\My Documents\My Pictures 

Ce dossier contient deux fichiers ('Flower.jpg','Waterfall.jpg')
Compresser le fichier en utilisant 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; 
    } 
} 

Extraire le fichier à cet endroit fonctionne très bien, car il requiert le mot de passe:

\MyDevice\My Documents\Personal 

Mais! Lorsque j'extrais 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 cela?
J'espère que quelqu'un pourrait répondre. Merci!

+0

Êtes-vous sûr que les fichiers sont extraits? Vous les extrayez dans le même dossier où vous avez compressé les fichiers. Donc, les fichiers existent déjà dans ce dossier – Jehof

+0

Oui, j'ai également essayé de renommer les fichiers avant de les extraire pour m'assurer que les fichiers sont extraits. J'ai aussi mis le point d'arrêt sur la boucle foreach, pour voir s'il y a des fichiers collectés à extraire. – fiberOptics

+0

Si vous pensez que c'est un bug, vous devriez le signaler ici: http://dotnetzip.codeplex.com/workitem/list/basic –

Répondre

3

Il y a un bogue dans votre méthode Compress(). Lors de la compression de vos fichiers, la propriété Password de l'instance ZipFile n'est jamais définie. Jetez un oeil à votre logique qui décide d'attribuer ou non la propriété zip.Password.

Il se lit comme suit:

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

Comme écrit, la propriété zip.Password sera activé que si le paramètre de mot de passe est null ou une chaîne vide. Si le paramètre Password est une chaîne non vide, le code ignore l'instruction d'affectation zip.Password.

L'instruction if dans votre méthode Compress() manque un opérateur not. Il devrait être:

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

C'était mon projet en mars dernier. En fait, j'ai présenté mon projet avec soin sans montrer le bug. Grâce à Dieu, je suis passé! – fiberOptics

Questions connexes