解压缩并读取C#中的.gz(Gzip文件)

安奇

成员
已加入
2020年12月16日
留言内容
17
编程经验
3-5
下面是我从azure blob容器中读取一个csv文件,然后调用一个函数来复制表格存储中的内容的方法。
现在,我的要求发生了一些变化,.blob容器中的.csv文件将被压缩为.gz文件。我想知道,如何修改以下代码,以便可以读取.gz文件,将其解压缩,然后在传递内容时传递内容
C#:
public async Task<string> ReadStream(string BlobcontainerName, string fileName, string connectionString)
        {
            
            var contents = await DownloadBlob(BlobcontainerName, fileName, connectionString);
            string data = Encoding.UTF8.GetString(contents.ToArray());
            return data;
        }

foreach (var files in recFiles)// recFiles are list of CSV files
            {
                string data = await ReadStream(containerName, files.Name, connectionString);}
c#
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,523
地点
悉尼,澳大利亚
编程经验
10+

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,523
地点
悉尼,澳大利亚
编程经验
10+
In that code, what type is contents? Basically, you need to have your data exposed via a Stream of some sort and you then put a GZipStream on top of that, then you read the data from that like you would any other Stream. For example, if contents is a MemoryStream:
C#:
using (var unzipper = new GZipStream(contents, CompressionLevel.Optimal))
{
    // Use unzipper here.
}
 

安奇

成员
已加入
2020年12月16日
留言内容
17
编程经验
3-5
In that code, what type is contents? Basically, you need to have your data exposed via a Stream of some sort and you then put a GZipStream on top of that, then you read the data from that like you would any other Stream. For example, if contents is a MemoryStream:
C#:
using (var unzipper = new GZipStream(contents, CompressionLevel.Optimal))
{
    // Use unzipper here.
}
内容是内存流,文件名将是test1.csv.gz,在//使用解压缩程序中,我应该提供Decompress(fileName)?
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,523
地点
悉尼,澳大利亚
编程经验
10+
在//使用解压缩器中,我应该提供Decompress(fileName)?
There is no such method. You should read the documentation for the GZipStream class. It works the same as any other Stream from the outside.
 

安奇

成员
已加入
2020年12月16日
留言内容
17
编程经验
3-5
There is no such method. You should read the documentation for the GZipStream class. It works the same as any other Stream from the outside.
我在这里看到你的意思,现在的问题是我看到Unzipper的Read方法与我传递的内容很接近"data"多变的?但是我看不到如果我像这样过去就可以工作

C#:
using (var unzipper = new GZipStream(contents, CompressionMode.Decompress))
            {
                //unzipper.ReadByte();
                string data = Encoding.UTF8.GetString(unzipper.ReadByte().ToArray());
            }
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,523
地点
悉尼,澳大利亚
编程经验
10+
If you have read the documentation then you know that ReadByte reads one byte. Is that what you want to do? Obviously not. Do some research and learn how to read data from a Stream. It doesn't matter what type of Stream it is as they are all Streams, e.g. reading from a FileStream is the same as reading from a GZipStream.
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,048
地点
挪威
编程经验
10+
使用CompressionMode.Decompress作为第二个参数是正确的,CompressionLevel用于压缩。
另外,由于这是字符串内容,因此您可以使用StreamReader来读取GZipStream,它具有便捷的ReadToEnd方法(或ReadToEndAsync)。
 

安奇

成员
已加入
2020年12月16日
留言内容
17
编程经验
3-5
我写了这样的代码,并且在编写测试用例时能够读取.gz文件。在生产中但是我得到错误"流不支持阅读。 (参数“流”)"在线上我正在使用GZip。我现在在做什么错?


C#:
public async Task<string> ReadStream(string containerName, string digestFileName,string fileName, string connectionString)
        {
            string data = string.Empty;
            string fileExtension = Path.GetExtension(fileName);
            var contents = await DownloadBlob(containerName, digestFileName, connectionString);
            if (fileExtension == ".gz")
            {
//Error on this line
                using (var unzipper = new GZipStream(contents, CompressionMode.Decompress))
                {
                    using (StreamReader reader = new StreamReader(unzipper, Encoding.UTF8))
                    {
                        data = reader.ReadToEnd();
                    }

                }
            }
            else
            {
               data = Encoding.UTF8.GetString(contents.ToArray());
            }
            return data;
        }
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,530
地点
弗吉尼亚州切萨皮克
编程经验
10+
您确定该流包含有效的压缩数据流吗?
 
最佳 底部