将对象转换为 CSV,然后在不接触物理存储的情况下进行压缩

Convert object to CSV and then compress without touching physical storage

场景

我有一个对象,我将其转换为平面 CSV,然后压缩并上传到文件存储。

我可以按照以下步骤轻松完成此操作。

  1. 将对象转换为 CSV 文件。
  2. 压缩文件
  3. 上传文件。

但是

我不想因为接触物理存储而受到惩罚,所以想在内存中完成所有这些工作。

当前不正确的实现

  1. 将对象转换为 CSV 字节数组
  2. 压缩字节数组
  3. 上传字节数组到文件存储

问题

我实际上在做的是压缩一个字节数组并上传它。这显然是错误的。 (因为当压缩的 Gzip 文件解压缩时,它包含一个 csv 的字节数组而不是实际的 csv 本身。)

是否可以在内存中创建一个类似 "file.csv" 的文件,然后在内存中压缩它,而不是压缩一个字节数组?

我遇到的问题是,在保存到物理位置时,我似乎只能命名文件并指定其扩展名。

当前实现的代码示例

public byte[] Example(IEnumerable<object> data)
    {
        // Convert Object to CSV and write to byte array.
        byte[] bytes = null;
        using (var ms = new MemoryStream())
        {
            TextWriter writer = new StreamWriter(ms);
            var csv = new CsvWriter(writer);
            csv.WriteRecords(data);
            writer.Flush();
            ms.Position = 0;
            bytes = ms.ToArray();
        }

        //Compress byte array
        using (var compressedStream = new MemoryStream(bytes))
        using (var resultStream = new MemoryStream())
        using (var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress))
        {
            zipStream.CopyTo(resultStream);
            zipStream.Close();

            var gzipByteArray =  resultStream.ToArray();
            //Upload to AzureStorage
            new AzureHelper().UploadFromByteArray(gzipByteArray, 0, gzipByteArray.Length);
        }
    }

将您用于上传的 Stream 包裹在 GZipStream 中,将您的 CSV 写入其中,然后您将上传压缩的 CSV。