Search code examples
c#azureazure-blob-storageunzip

How to read Zipped txt file (blob) which locates in Azure container without downloading?


I can read txt file with this code, but when I try to read the txt.gz file of course it doesn't work. How can I read zipped blob without downloading, because the framework will work on cloud? Maybe it is possible to unzip the file to another container? But I couldn't find a solution.

public static string GetBlob(string containerName, string fileName)
{
    string connectionString = $"yourConnectionString";

    // Setup the connection to the storage account
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

    // Connect to the blob storage
    CloudBlobClient serviceClient = storageAccount.CreateCloudBlobClient();
    // Connect to the blob container
    CloudBlobContainer container = serviceClient.GetContainerReference($"{containerName}");
    // Connect to the blob file
    CloudBlockBlob blob = container.GetBlockBlobReference($"{fileName}");
    // Get the blob file as text
    string contents = blob.DownloadTextAsync().Result;

    return contents;
}

Solution

  • You can use GZipStream to decompress your gz file on the fly, you don't have to worry about downloading it and decompressing it on a physical location.

    public static string GetBlob(string containerName, string fileName)
    {
        string connectionString = $"connectionstring";
    
        // Setup the connection to the storage account
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
    
        // Connect to the blob storage
        CloudBlobClient serviceClient = storageAccount.CreateCloudBlobClient();
        // Connect to the blob container
        CloudBlobContainer container = serviceClient.GetContainerReference($"{containerName}");
        // Connect to the blob file
        CloudBlockBlob blob = container.GetBlockBlobReference($"{fileName}");
        // Get the blob file as text
        using (var gzStream = await blob.OpenReadAsync())
        {
            using (GZipStream decompressionStream = new GZipStream(gzStream, CompressionMode.Decompress))
            {
                using (StreamReader reader = new StreamReader(decompressionStream, Encoding.UTF8))
                {
                    return reader.ReadToEnd();
                }
            }
        }
    }