2014-12-01 2 views
1

Я хочу, чтобы сжать и зашифровать файл в один раз, используя этот простой код:DeflateStream/GZipStream к CryptoStream и наоборот

public void compress(FileInfo fi, Byte[] pKey, Byte[] pIV) 
{ 
    // Get the stream of the source file. 
    using (FileStream inFile = fi.OpenRead()) 
    {     
     // Create the compressed encrypted file. 
     using (FileStream outFile = File.Create(fi.FullName + ".pebf")) 
     { 
      using (CryptoStream encrypt = new CryptoStream(outFile, Rijndael.Create().CreateEncryptor(pKey, pIV), CryptoStreamMode.Write)) 
      { 
       using (DeflateStream cmprss = new DeflateStream(encrypt, CompressionLevel.Optimal)) 
       { 
        // Copy the source file into the compression stream. 
        inFile.CopyTo(cmprss); 
        Console.WriteLine("Compressed {0} from {1} to {2} bytes.", fi.Name, fi.Length.ToString(), outFile.Length.ToString()); 
       } 
      } 
     } 
    } 
} 

Следующие строки будут восстанавливать зашифрованные и сжатые файлы обратно к оригиналу :

public void decompress(FileInfo fi, Byte[] pKey, Byte[] pIV) 
{ 
    // Get the stream of the source file. 
    using (FileStream inFile = fi.OpenRead()) 
    { 
     // Get original file extension, for example "doc" from report.doc.gz. 
     String curFile = fi.FullName; 
     String origName = curFile.Remove(curFile.Length - fi.Extension.Length); 

     // Create the decompressed file. 
     using (FileStream outFile = File.Create(origName)) 
     { 
      using (CryptoStream decrypt = new CryptoStream(inFile, Rijndael.Create().CreateDecryptor(pKey, pIV), CryptoStreamMode.Read)) 
      { 
       using (DeflateStream dcmprss = new DeflateStream(decrypt, CompressionMode.Decompress)) 
       {      
        // Copy the uncompressed file into the output stream. 
        dcmprss.CopyTo(outFile); 
        Console.WriteLine("Decompressed: {0}", fi.Name); 
       } 
      } 
     } 
    } 
} 

Это работает также с GZipStream.

+0

@CSharpie: Да; он пишет в поток. – SLaks

+0

BTW, 'Path.GetFileNameWithoutExtension()'. – SLaks

+0

Какова трассировка стека исключений? – SLaks

ответ

1

Ожидается, что декомпрессионный поток будет read from, не записанный на. (В отличие от CryptoStream, который поддерживает все четыре комбинации чтения/записи и шифрования/дешифрования)

Вы должны создать DeflateStream вокруг CryptoStreamMode.Read потока вокруг входного файла, а затем скопировать из этого непосредственно в выходной поток.

+0

@zaqk: Пожалуйста, обновите свой вопрос с исправленным кодом, чтобы первая ошибка не путала вещи. – EricLaw

+0

@zaqk: вам нужно сделать CryptoStream считанным из входного потока, а не записывать в выходной поток. – SLaks

+0

@zaqk: Это совершенно неправильно. Вам нужно создать как потоки вокруг друг друга, так и ** входной ** файл, а затем скопировать непосредственно в выходной поток. – SLaks

Смежные вопросы