c# - c# GPG 压缩和加密文件流
问题描述
我需要 ZIP 和 GPG 加密文件流。然后通过 SFTP 上传。我正在使用 Zip Archive 来创建条目。我正在使用 GPG 进行加密,starksoft.aspen Nuget。
在此处获取本地文件流并返回本地文件流的 I Enumerable
private static IEnumerable<LocalFile> GetLocalFiles(string dir) =>
Directory.EnumerateFiles(dir, "*", SearchOption.AllDirectories)
.Select(path =>
{
var relativePath = path.Substring(dir.Length + 1);
var localFile = new LocalFile(relativePath, () => File.OpenRead(path));
localFile.Folder = Directory.GetDirectories(dir, "*", SearchOption.TopDirectoryOnly)
.Select(d => d.Split('\\').LastOrDefault()).FirstOrDefault();
return localFile;
});
然后我压缩本地流的 IEnumerable
public async Task WriteAsync(IEnumerable<LocalFile> files)
{
FileStream GetTempFileStream() =>
new FileStream(
path: Path.GetTempFileName(),
mode: FileMode.Open,
access: FileAccess.ReadWrite,
share: FileShare.None,
bufferSize: 4096,
options: FileOptions.DeleteOnClose);
//temp fix to resolve the arb naming for zip files
var folder = files.Select(x => x.Folder).FirstOrDefault()
?? DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss");
var zipFile = new LocalFile(
folder+".zip",
async () =>
{
var tempFileStream = GetTempFileStream();
using (var archive = new ZipArchive(tempFileStream, ZipArchiveMode.Create, true))
{
foreach (var file in files)
{
using (var localStream = (await file.OpenLocal()))
using (var zipEntryStream = archive.CreateEntry(file.RelativePath).Open())
{
await localStream.CopyToAsync(zipEntryStream);
}
}
}
tempFileStream.Seek(0, SeekOrigin.Begin);
return tempFileStream;
});
然后我需要加密zip流的IEnumerable ...
谢谢
解决方案
深入了解我遇到的问题是流在传递给我的 Writer 之前没有完成加密。
这是我对压缩和加密所做的,希望对某人有所帮助
public async Task WriteAsync(IEnumerable<LocalFile> files)
{
var folder = files.Select(x => x.Folder).FirstOrDefault()
?? DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss");
using (var archiveStream = new MemoryStream())
{
using (var archive = new ZipArchive(archiveStream, ZipArchiveMode.Create, true))
{
foreach (var file in files)
{
using (var entry = archive.CreateEntry(file.RelativePath).Open())
using (var local = (await file.OpenLocal()))
{
local.CopyTo(entry);
}
}
}
var bytes = archiveStream.ToArray();
var encryptionClient = new EncryptionClient("ahmad.zeitoun@medxm1.com", "Password7");
var encryption = new EncryptFiles(encryptionClient);
using (var encryptedStream = new MemoryStream())
{
using (var zipStream = new MemoryStream(bytes))
{
encryption.Gpg.Encrypt(zipStream, encryptedStream);
}
this.bytesArr = encryptedStream.ToArray();
}
}
await this.Writer.WriteAsync(new[] { new LocalFile(folder + ".zip.gpg", () => new MemoryStream(this.bytesArr)) });
推荐阅读
- mysql - mysql:选择所有行并与其他表进行比较
- java - 导入了外部 jar,但仍然出现“无法解决”错误
- git - 在 git merge/rebase 中,如何不因 git blame 而失去作者
- c# - .Net 上传图像 - Microsoft Azure
- java - 为什么 th:text 不想显示在 main.html 模板中,而它显示在其他页面中?
- python - 使用值列表访问字典的键
- mongodb - 在 Azure 数据工厂中创建 MongoDB 链接服务
- wear-os - Wear OS Android Studio 背景图片
- websocket - SockJS + Proxy + Apache2:wss:// 不工作,只能轮询
- php - 在 laravel 中插入新数据更新多行