it-swarm.com.ru

создать Zip-файл в .net с паролем

Я работаю над проектом, который мне нужен, чтобы создать Zip с паролем, защищенным от содержимого файла в C #.

Прежде чем я использую System.IO.Compression.GZipStream для создания содержимого gzip . Имеет ли .net какую-либо функциональность для создания файла, защищенного паролем Zip или rar?

7
Hamed_gibago

Взгляните на DotNetZip

Он имеет довольно полезную документацию, а также позволяет загружать DLL во время выполнения в виде внедренного файла.

5
Jan18101997

К сожалению, в фреймворке такой функциональности нет. Есть способ сделать Zip файлы, но без пароля. Если вы хотите создавать Zip-файлы, защищенные паролем, в C #, я бы порекомендовал SevenZipSharp . Это в основном управляемая оболочка для 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
Manfred Radlwimmer

Я хочу добавить еще несколько альтернатив.

Для .NET можно использовать SharpZipLib , для Xamarin - SharpZipLib.Portable .

Пример для .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;
}

Больше образцов можно найти здесь .

Если вы можете жить без функции пароля, можно упомянуть ZipStorer или встроенную функцию .NET в System.IO.Compression .

0
testing