加密并压缩 FileStream 并保存到同一个文件

Encrypt and compress FileStream and save to same file

我有一种压缩和加密流的方法。

private static void CompressThenEncrypt(string inputFileName, ICryptoTransform encryptor) 
{
    using (var inputFileStream = new FileStream(inputFileName, FileMode.Open, FileAccess.ReadWrite)) 
    using (var cryptoStream = new CryptoStream(inputFileStream, encryptor, CryptoStreamMode.Write))
    using (var zipStream = new GZipStream(cryptoStream, CompressionMode.Compress)) 
    {
        inputFileStream.CopyTo(zipStream);
    }
}

它确实有效,但它将压缩和加密的数据附加到我在该文件中的原始数据。

所以如果我的文件包含:

kkk

然后在压缩和加密之后它确实看起来像这样的例子:

kkkㆆ鬁⠕⟶ꏙᇚ셑襜㷡ꕢ束৘㺝娥☪

有谁知道如何覆盖新数据吗?

我建议:

  1. 写入新文件
  2. 删除旧文件
  3. 将新文件重命名为旧文件。

写入临时内存流。类似于:

private static void CompressThenEncrypt(string inputFileName, ICryptoTransform encryptor) 
{
    using (var fileStream = new FileStream(inputFileName,FileMode.Open, FileAccess.ReadWrite))
    using (var memoryStream = new MemoryStream())
    using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
    using (var zipStream = new GZipStream(cryptoStream, CompressionMode.Compress)) 
    {
        fileStream.CopyTo(zipStream);
        cryptoStream.FlushFinalBlock();
        fileStream.SetLength(0);
        memoryStream.Position = 0;
        memoryStream.CopyTo(fileStream);
    }
}

我认为这应该可行,从我的头顶开始。不确定您是否必须设置长度,而且我不确定您是否可以不重置 MemoryStream 的位置而逃脱。我没有测试过这段代码。如果您担心内存使用,您可以随时缓冲使用,但这需要更复杂的代码。