简体   繁体   English

c#GPG压缩并加密文件流

[英]c# GPG Zip and Encrypt a Stream of files

I need to ZIP and GPG Encrypt a Stream of files. 我需要对ZIP和GPG加密文件流。 Then upload via SFTP. 然后通过SFTP上传。 I am using Zip Archive to create entries. 我正在使用Zip存档创建条目。 I am using GPG to encrypt, starksoft.aspen Nuget. 我正在使用GPG加密starksoft.aspen Nuget。

Getting local file streams here and returning an I Enumerable of local file streams 在此处获取本地文件流并返回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;
                   });

Then I zip the IEnumerable of local streams 然后我压缩本地流的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;
                });

Then I need to encrypt the IEnumerable of zip stream... 然后我需要加密zip流的IEnumerable ...

Thank you 谢谢

got to the bottom of this The problem I had was the stream was not done encrypting before being passed by to my Writer. 我的问题是流在传递给我的Writer之前没有完成加密。

Here is what I did to zip and encrypt , I hope this helps someone 这是我所做的压缩和加密操作,希望对您有所帮助

    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)) });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM