加密并压缩 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ㆆ鬁⠕⟶ꏙᇚ셑襜㷡ꕢ束㺝娥☪
有谁知道如何覆盖新数据吗?
我建议:
- 写入新文件
- 删除旧文件
- 将新文件重命名为旧文件。
写入临时内存流。类似于:
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 的位置而逃脱。我没有测试过这段代码。如果您担心内存使用,您可以随时缓冲使用,但这需要更复杂的代码。
我有一种压缩和加密流的方法。
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ㆆ鬁⠕⟶ꏙᇚ셑襜㷡ꕢ束㺝娥☪
有谁知道如何覆盖新数据吗?
我建议:
- 写入新文件
- 删除旧文件
- 将新文件重命名为旧文件。
写入临时内存流。类似于:
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 的位置而逃脱。我没有测试过这段代码。如果您担心内存使用,您可以随时缓冲使用,但这需要更复杂的代码。