2009-10-28 6 views
3

Étant donné un chemin d'accès à un fichier, comment puis-je vérifier que le fichier est un fichier zip protégé par un mot de passe?Comment valider qu'un fichier est un fichier ZIP protégé par mot de passe, en utilisant C#

En d'autres termes, comment implémenter cette fonction?

bool IsPasswordProtectedZipFile(string pathToFile) 

Je ne ai pas besoin de décompresser le fichier - Je dois juste pour vérifier qu'il est un ZIP et a été protégé par un certain mot de passe.

Merci

+0

voir cette question: [comment compresser et décompresser en utilisant le mot de passe dans C# programme] (http://stackoverflow.com/questions/1607858/how-to-zip-and-unzip-using-password-in-c- programme) – manji

Répondre

3

En utilisant SharpZipLib, le code suivant fonctionne. Et par les travaux, je veux dire entry.IsCrypted renvoie vrai ou faux basé sur s'il existe ou non un mot de passe pour la première entrée dans le fichier zip.

var file = @"c:\testfile.zip"; 
FileStream fileStreamIn = new FileStream(file, FileMode.Open, FileAccess.Read); 
ZipInputStream zipInStream = new ZipInputStream(fileStreamIn); 
ZipEntry entry = zipInStream.GetNextEntry(); 
Console.WriteLine("IsCrypted: " + entry.IsCrypted); 

Il y a un tutoriel simple sur l'utilisation SharpZipLib sur CodeProject.

Ainsi, une implémentation simple ressemble à quelque chose comme:

public static bool IsPasswordProtectedZipFile(string path) 
{ 
    using (FileStream fileStreamIn = new FileStream(path, FileMode.Open, FileAccess.Read)) 
    using (ZipInputStream zipInStream = new ZipInputStream(fileStreamIn)) 
    { 
     ZipEntry entry = zipInStream.GetNextEntry(); 
     return entry.IsCrypted; 
    } 
} 

Remarque il n'y a pas de véritable manipulation ou quoi que ce soit une erreur ...

+0

Merci - le point clé que je me rends compte maintenant est que j'ai besoin de regarder les entrées individuelles dans le ZIP, car ils peuvent être cryptés individuellement. Le mot de passe ne s'applique pas à l'ensemble du fichier ZIP. DotNetZip à codéplex a une capacité similaire, aussi. – frankadelic

+0

Oui, exactement. Et à cause de cela, vous pouvez, par exemple, vouloir parcourir toute l'archive à la recherche de _any_ entrées qui ont un mot de passe, plutôt que seulement le premier ... –

1

À ce stade de la maturité .NET Framework, vous devez utiliser un outil 3ème partie. Il y a beaucoup de bibliothèques commerciales qui peuvent être googled. Je suggère un gratuit du site Web Codeplex de Microsoft DotNetZip. La première page indique "la bibliothèque prend en charge les mots de passe zip".

3

Dans les archives ZIP, le mot de passe est placé sur le fichier, mais sur la entrées individuelles dans le fichier. Un zip peut contenir certaines entrées cryptées et d'autres pas. Voici quelques exemples de code pour vérifier le chiffrement sur les entrées dans DotNetZip:

int encryptedEntries = 0; 
using (var zip = ZipFile.Read(nameOfZipFile)) 
{ 
    // check a specific, named entry: 
    if (zip["nameOfEntry.doc"].UsesEncryption) 
     Console.WriteLine("Entry 'nameOfEntry.doc' uses encryption"); 

    // check all entries: 
    foreach (var e in zip) 
    { 
     if (e.UsesEncryption) 
     { 
      Console.WriteLine("Entry {0} uses encryption", e.FileName); 
      encryptedEntries++; 
     } 
    } 
} 

if (encryptedEntries > 0) 
    Console.WriteLine("That zip file uses encryption on {0} entrie(s)", encryptedEntries); 

Si vous préférez, vous pouvez utiliser LINQ:

private bool ZipUsesEncryption(string archiveToRead) 
{ 
    using (var zip = ZipFile.Read(archiveToRead)) 
    { 
     var selection = from e in zip.Entries 
      where e.UsesEncryption 
      select e; 

     return selection.Count > 0; 
    } 
} 
+0

Merci. J'ai également trouvé cette solution DotNetZip - voir mes commentaires dans la réponse acceptée ci-dessus. – frankadelic

0

Il n'y a pas de manière correcte à 100% pour vérifier si tous les zip les entrées sont cryptées. chaque entrée dans un fichier zip est indépendante et pourrait avoir son propre mot de passe/méthode cryptée. Dans la plupart des cas, zipfile est zippé par un logiciel, ce logiciel garantit que chaque entrée d'un fichier zip a un mot de passe commun et une méthode cryptée. Donc, en utilisant le premier zipentry (pas un répertoire) pour vérifier si ce fichier zip est chiffré, on peut couvrir la plupart des cas.

Questions connexes