web-dev-qa-db-fra.com

créer un fichier Zip en .net avec mot de passe

Je travaille sur un projet dont j'ai besoin pour créer Zip avec un mot de passe protégé du contenu du fichier en c #.

Avant, j’utilisais System.IO.Compression.GZipStream pour créer du contenu gzip . Est-ce que .net dispose d’une fonctionnalité permettant de créer un fichier protégé par mot de passe Zip ou rar?

7
Hamed_gibago

Jetez un oeil à DotNetZip

Il a une très bonne documentation et vous permet également de charger la DLL à l'exécution en tant que fichier intégré.

5
Jan18101997

Malheureusement, cette fonctionnalité n’existe pas dans le cadre. Il existe un moyen de créer des fichiers Zip, mais sans mot de passe. Si vous voulez créer des fichiers Zip protégés par mot de passe en C #, je vous recommande SevenZipSharp . C'est fondamentalement un wrapper managé pour 7-Zip.

SevenZipBase.SetLibraryPath(Path.Combine(
        Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? Environment.CurrentDirectory,
        "7za.dll"));

SevenZipCompressor compressor = new SevenZipCompressor();

compressor.Compressing += Compressor_Compressing;
compressor.FileCompressionStarted += Compressor_FileCompressionStarted;
compressor.CompressionFinished += Compressor_CompressionFinished;

string password = @"whatever";
string destinationFile = @"C:\Temp\whatever.Zip";
string[] sourceFiles = Directory.GetFiles(@"C:\Temp\YourFiles\");

if (String.IsNullOrWhiteSpace(password))
{
    compressor.CompressFiles(destinationFile, sourceFiles);
}
else
{
    //optional
    compressor.EncryptHeaders = true;
    compressor.CompressFilesEncrypted(destinationFile, password, sourceFiles);
}
1

Je veux ajouter quelques alternatives.

Pour .NET, vous pouvez utiliser SharpZipLib , pour Xamarin, utilisez SharpZipLib.Portable .

Exemple pour .NET:

using ICSharpCode.SharpZipLib.Zip;

// Compresses the supplied memory stream, naming it as zipEntryName, into a Zip,
// which is returned as a memory stream or a byte array.
//
public MemoryStream CreateToMemoryStream(MemoryStream memStreamIn, string zipEntryName) {

    MemoryStream outputMemStream = new MemoryStream();
    ZipOutputStream zipStream = new ZipOutputStream(outputMemStream);

    zipStream.SetLevel(3); //0-9, 9 being the highest level of compression
    zipStream.Password = "Your password";

    ZipEntry newEntry = new ZipEntry(zipEntryName);
    newEntry.DateTime = DateTime.Now;

    zipStream.PutNextEntry(newEntry);

    StreamUtils.Copy(memStreamIn, zipStream, new byte[4096]);
    zipStream.CloseEntry();

    zipStream.IsStreamOwner = false;    // False stops the Close also Closing the underlying stream.
    zipStream.Close();          // Must finish the ZipOutputStream before using outputMemStream.

    outputMemStream.Position = 0;
    return outputMemStream;

    // Alternative outputs:
    // ToArray is the cleaner and easiest to use correctly with the penalty of duplicating allocated memory.
    byte[] byteArrayOut = outputMemStream.ToArray();

    // GetBuffer returns a raw buffer raw and so you need to account for the true length yourself.
    byte[] byteArrayOut = outputMemStream.GetBuffer();
    long len = outputMemStream.Length;
}

Plus d'échantillons peuvent être trouvés ici .

Si vous pouvez vivre sans fonctionnalité de mot de passe, on peut mentionner ZipStorer ou la fonction .NET intégrée dans System.IO.Compression .

0
testing