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

时间:2018-01-23 13:03:29

标签: c# stream filestream

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

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ㆆ鬁⠕⟶ꏙᇚ셑襜㷡ꕢ束৘㺝娥☪

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

2 个答案:

答案 0 :(得分:2)

我建议:

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

答案 1 :(得分:0)

写入临时MemoryStream。类似的东西:

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的位置。我还没有测试过这段代码。如果您担心内存使用情况,可以随时缓冲使用情况,但这需要更复杂的代码。