如何解决为什么使用 C# 创建 *.gz 文件后我会得到损坏的 *.gz 文件?
我正在开发一个 .NET 5、C# 控制台应用程序,用于从自定义对象列表创建一个 CSV 文件,对其进行 gzip,然后使用以下代码将其上传到 Azure 存储容器:
var blobServiceClient = new BlobServiceClient("My connection string");
var containerClient = GetBlobContainerClient("My container name");
var config = new CsvConfiguration(CultureInfo.CurrentCulture) { Delimiter = ";",Encoding = Encoding.UTF8 };
var list = new List<FakeModel>
{
new FakeModel { Field1 = "A",Field2 = "B" },new FakeModel { Field1 = "C",Field2 = "D" }
};
await using var memoryStream = new MemoryStream();
await using var streamWriter = new StreamWriter(memoryStream);
await using var csvWriter = new CsvWriter(streamWriter,config);
await csvWriter.WriteRecordsAsync(list);
await using var zip = new GZipStream(memoryStream,CompressionMode.Compress,true);
await memoryStream.copyToAsync(zip);
memoryStream.Seek(0,SeekOrigin.Begin);
var blockBlob = containerClient.GetBlockBlobClient("test.csv.gz");
await blockBlob.UploadAsync(memoryStream);
它似乎可以工作,但是当我从云端下载 gzip 进行检查时,在尝试解压缩时出现以下错误:
你能帮我理解为什么吗?
解决方法
new GZipStream
的流参数是 destination 流。要处理输入到输出,您需要以某种方式写入 GZipStream 的实例。
当我试验它时,我发现调用 csvWriter.FlushAsync()
是必要的。
像这样:
class Program
{
public class FakeModel
{
public string Field1 { get; set; }
public string Field2 { get; set; }
}
static async Task Main(string[] args)
{
var config = new CsvConfiguration(CultureInfo.CurrentCulture) { Delimiter = ";",Encoding = Encoding.UTF8 };
var list = new List<FakeModel>
{
new FakeModel { Field1 = "A",Field2 = "B" },new FakeModel { Field1 = "C",Field2 = "D" }
};
await using var memoryStream = new MemoryStream();
await using var streamWriter = new StreamWriter(memoryStream);
await using var csvWriter = new CsvWriter(streamWriter,config);
await csvWriter.WriteRecordsAsync(list);
await csvWriter.FlushAsync();
memoryStream.Position = 0;
await using var fs = new FileStream(@"C:\temp\SO67935249.csv.gz",FileMode.Create);
await using var zip = new GZipStream(fs,CompressionMode.Compress,true);
await memoryStream.CopyToAsync(zip);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。